为什么我的代码抛出ClassNotFoundException?

问题描述:

我试图简单地放置图像,dotpowder.png,触摸屏幕。很简单,对吗?显然不是,因为图像是一个类,具有属性,所以我可以把它当作动态对象而不是ImageView。下面是DotCanvas.java代码:为什么我的代码抛出ClassNotFoundException?

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) 

此外,你可以从堆栈跟踪告诉,它已经开始抛出NullPointerException异常也是如此。

+0

发布例外。 – hackbod 2011-05-21 05:13:59

+0

他写了关于ClassNotFoundException。 – Divers 2011-05-21 05:18:26

+4

我认为hackbod是指堆栈跟踪 – kuriouscoder 2011-05-21 05:20:52

的问题确实是在这一行:调用构造函数之前,也一定mContext为null这里

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

此代码调用。只需将初始化代码放入构造函数中,就可以了。希望这可以帮助。

+0

谢谢,所以我改变了开始DotBase.java:/nblah – ProjectEW 2011-05-21 16:29:46

+0

请忽略第一条评论,那是一场意外。不管怎样,谢谢。 所以我改变了DotBase.jav的开头: 'public class DotBase {0}私有上下文mContext; public DotBase(Context context,float x,float y){DotHandler.addDotToArray(this); mContext = context; xCoord = x; y = 0; y = 0; y = 0; } private Bitmap dotBitmap = BitmapFactory.decodeResource(mContext.getResources(),R.drawable。dotpowder); 私人浮动xCoord; private float yCoord;' – ProjectEW 2011-05-21 16:36:27

+0

我将用更新的代码更新OP,该代码现在引发IndexOutOfBoundsException。请忽略我在这里的其他评论。这是我在*上的第一次,我仍然不知道如何做一些事情。 – ProjectEW 2011-05-21 17:06:25

在DotBase.java的第17行调用“mContext.getResources()”方法可能会引发NullPointerException。 DotBase#mContext的起源是DotCanvas类构造函数中的参数“mContext”。

请检查通过DotCanvas构造函数传递的对象。

+0

从DotHandler中可以看到,DotHandler本身就是传递给DotCanvas构造函数的对象。我不知道这是否有问题,虽然我不相信。 – ProjectEW 2011-05-21 06:10:41

+0

chech'mContext.getResources(),R.drawable.dotpowder'可能为空,而'BitmapFactory.decodeResource'调试或's.out'值 – 2011-05-21 06:31:21