为什么我的代码抛出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异常也是如此。
的问题确实是在这一行:调用构造函数之前,也一定mContext为null这里
private Bitmap dotBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.dotpowder);
此代码调用。只需将初始化代码放入构造函数中,就可以了。希望这可以帮助。
谢谢,所以我改变了开始DotBase.java:/nblah – ProjectEW 2011-05-21 16:29:46
请忽略第一条评论,那是一场意外。不管怎样,谢谢。 所以我改变了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
我将用更新的代码更新OP,该代码现在引发IndexOutOfBoundsException。请忽略我在这里的其他评论。这是我在StackOverflow上的第一次,我仍然不知道如何做一些事情。 – ProjectEW 2011-05-21 17:06:25
在DotBase.java的第17行调用“mContext.getResources()”方法可能会引发NullPointerException。 DotBase#mContext的起源是DotCanvas类构造函数中的参数“mContext”。
请检查通过DotCanvas构造函数传递的对象。
从DotHandler中可以看到,DotHandler本身就是传递给DotCanvas构造函数的对象。我不知道这是否有问题,虽然我不相信。 – ProjectEW 2011-05-21 06:10:41
chech'mContext.getResources(),R.drawable.dotpowder'可能为空,而'BitmapFactory.decodeResource'调试或's.out'值 – 2011-05-21 06:31:21
发布例外。 – hackbod 2011-05-21 05:13:59
他写了关于ClassNotFoundException。 – Divers 2011-05-21 05:18:26
我认为hackbod是指堆栈跟踪 – kuriouscoder 2011-05-21 05:20:52