2011-05-21 100 views
1

我試圖簡單地放置圖像,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

回答

0

的問題確實是在這一行:調用構造函數之前,也一定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。請忽略我在這裏的其他評論。這是我在StackOverflow上的第一次,我仍然不知道如何做一些事情。 – ProjectEW 2011-05-21 17:06:25

0

在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

相關問題