Почему мой код вызывает исключение ClassNotFoundException?

1

Я пытаюсь просто поместить изображение, dotpowder.png, когда вы касаетесь экрана. Достаточно просто, не так ли? По-видимому, нет, поскольку образ должен быть классом, с атрибутами, поэтому я могу рассматривать его как динамический объект вместо ImageView. Вот код для DotCanvas.java:

package com.dhg.dots;

import android.content.Context;
import android.view.View;
import android.view.MotionEvent;
import android.graphics.Canvas;
import android.graphics.Point;

public class DotCanvas extends View {
    private Context mContext;
    public DotCanvas(Context context) {
        super(context);
        setFocusable(true);
        mContext = context;
    }
    private DotBase dot;

    @Override protected void onDraw(Canvas canvas) {
        for (int i = 0; i < DotHandler.dotList.size(); i++) {
            dot = DotHandler.dotList.get(i);
            dot.setY(dot.getY() + 1);

            canvas.drawBitmap(dot.getBitmap(), dot.getX(), dot.getY(), null);
        }
    }

    public boolean onTouchEvent(MotionEvent event) {
        Point dotPoint = new Point();
        dotPoint.x = (int)event.getX();
        dotPoint.y = (int)event.getY();
        new DotPowder(mContext, dotPoint.x, dotPoint.y);
        invalidate();
        return true;
    }
}

И это обновленный DotBase.java:

package com.dhg.dots;

import android.graphics.Bitmap;
import android.content.Context;
import android.graphics.BitmapFactory;

public class DotBase {
    private Context mContext;
    private Bitmap dotBitmap;

    public DotBase(Context context, float x, float y) {
        DotHandler.addDotToArray(this);
        mContext = context;
        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.dotpowder);
        dotBitmap = bitmap;
        xCoord = x;
        yCoord = y;
    }

    private float xCoord;
    private float yCoord;

    public void setX(float x) {
        xCoord = x;
    }

    public void setY(float y) {
        yCoord = y;
    }

    public float getX() {
        return xCoord;
    }

    public float getY() {
        return yCoord;
    }

    public void setGraphic(int id) {
        dotBitmap = BitmapFactory.decodeResource(mContext.getResources(), id);
    }

    public Bitmap getBitmap() {
        return dotBitmap;
    }
}

И, наконец, здесь DotPowder.java:

package com.dhg.dots;

import android.content.Context;

public class DotPowder extends DotBase {
    public DotPowder(Context context, float x, float y) {
        super(context, x, y);

        setGraphic(R.drawable.dotpowder);
    }
}

ClassNotFoundException возникает, когда создается новый DotBase, но я понятия не имею, почему.

P.S. Вот DotHandler.java, основное действие:

package com.dhg.dots;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;

public class DotHandler extends Activity {
    /** Called when the activity is first created. */
    public static List<DotBase> dotList = new ArrayList<DotBase>() {
    private static final long serialVersionUID = -946727550332680940L;
    };
    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new DotCanvas(this));
    }

    public static void addDotToArray(DotBase dot) {
        if (dotList.size() == 0) {
            dotList.add(0, dot);
        }
        else {
            dotList.add(dotList.size() + 1, dot);
        }
    }
}

И вот трассировка стека:

java.lang.NullPointerException
    at com.dhg.dots.DotBase.<init>(DotBase.java:17)
    at com.dhg.dots.DotPowder.<init>(DotPowder.java:7)
    at com.dhg.dots.DotCanvas.onTouchEvent(DotCanvas.java:32)
    at android.view.View.dispatchTouchEvent(View.java:3778)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:885)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:885)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:885)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1716)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1124)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2125)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1700)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:143)
    at android.app.ActivityThread.main(ActivityThread.java:5061)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)
java.lang.NullPointerException
    at com.dhg.dots.DotBase.<init>(DotBase.java:17)
    at com.dhg.dots.DotPowder.<init>(DotPowder.java:7)
    at com.dhg.dots.DotCanvas.onTouchEvent(DotCanvas.java:32)
    at android.view.View.dispatchTouchEvent(View.java:3778)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1716)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1124)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2125)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1700)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:143)
    at android.app.ActivityThread.main(ActivityThread.java:5061)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)
java.lang.NullPointerException
    at com.dhg.dots.DotBase.<init>(DotBase.java:17)
    at com.dhg.dots.DotPowder.<init>(DotPowder.java:7)
    at com.dhg.dots.DotCanvas.onTouchEvent(DotCanvas.java:32)
    at android.view.View.dispatchTouchEvent(View.java:3778)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1716)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1124)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2125)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1700)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:143)
    at android.app.ActivityThread.main(ActivityThread.java:5061)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)

Кроме того, как вы можете узнать из трассировки стека, он также начал метать NullPointerExceptions.

  • 0
    Опубликуйте исключение.
  • 0
    Он написал о ClassNotFoundException.
Показать ещё 3 комментария
Теги:

2 ответа

0
Лучший ответ

Проблема действительно в этой строке:

private Bitmap dotBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.dotpowder);

Этот код вызывается перед вызовом конструктора, и, безусловно, mContext здесь null. Просто поместите код инициализации внутри своего конструктора, и все будет в порядке. Надеюсь, это поможет.

  • 0
    Спасибо, поэтому я изменил начало DotBase.java:/nblah
  • 0
    Пожалуйста, игнорируйте первый комментарий, это был несчастный случай. В любом случае, спасибо. Поэтому я изменил начало DotBase.jav из: public class DotBase { private Context mContext; public DotBase(Context context, float x, float y) { DotHandler.addDotToArray(this); mContext = context; xCoord = x; yCoord = y; } private Bitmap dotBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.dotpowder); private float xCoord; private float yCoord;
Показать ещё 3 комментария
0

Вызов метода "mContext.getResources()" в строке 17 в DotBase.java может вызвать исключение NullPointerException. Происхождение DotBase # mContext - это параметр "mContext" в конструкторе класса DotCanvas.

Пожалуйста, проверьте, какой объект передан через конструктор DotCanvas.

  • 0
    Как видно из DotHandler, DotHandler сам по себе является объектом, переданным конструктору DotCanvas. Я не знаю, если это проблематично, хотя я не верю, что это так.
  • 0
    mContext.getResources(), R.drawable.dotpowder может быть нулевым, в то время как значение BitmapFactory.decodeResource или s.out

Ещё вопросы

Сообщество Overcoder
Наверх
Меню