诊断“RuntimeException:无法启动活动引起:java.lang.NullPointerException”

时间:2011-11-24 17:13:25

标签: java android runtime nullpointerexception

我不知道在哪里转,我正在关注一个android教程here并且在最新的更新中我遇到了运行时错误,我真的很难找到它的来源!

我的目标是在左侧的屏幕上出现一个小的“orb”图标,玩家可以在表面上拖放。

现在我对程序进行了一些更改,因为我上次编译成功了。所有这些都在GameView类中,您可以在这里看到:http://pastebin.com/zsYKFmuP。我还在这里创建了一个名为Orb的全新类:http://pastebin.com/wQKqcVtV

如果你有Android开发经验,那么查看我的代码应该不会太麻烦但是我感谢任何花时间提出任何建议的人!所有的建议将不胜感激!

logcat有这样说:

 FATAL EXCEPTION: main
 java.lang.RuntimeException: Unable to start activity ComponentInfo{biz.hireholly.tutorial/biz.hireholly.tutorial.MainActivity}: java.lang.NullPointerException
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
     at android.app.ActivityThread.access$1500(ActivityThread.java:121)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
     at android.os.Handler.dispatchMessage(Handler.java:99)
     at android.os.Looper.loop(Looper.java:130)
     at android.app.ActivityThread.main(ActivityThread.java:3701)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:507)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
     at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
     at biz.hireholly.tutorial.models.Orb.<init>(Orb.java:13)
     at biz.hireholly.tutorial.GameView.<init>(GameView.java:34)
     at biz.hireholly.tutorial.MainActivity.onCreate(MainActivity.java:25)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
     ... 11 more

来自Orb类的相关来源:

public class Orb {

        private Bitmap bitmap;  //image
        private int x;  //x coord
        private int y;  //y coord
        private boolean touched; //if orb is touched/picked up
        //just to make things simpler to read
        int halfBmpX = bitmap.getWidth() /2; // <<<=== Line 13
        int halfBmpY = bitmap.getHeight() /2;

4 个答案:

答案 0 :(得分:2)

您的Orb班级尝试从halfBmpX引用初始化Y(和null)。

初始化应该在构造函数中发生之后,你有一个有效的Bitmap来初始化。

public Orb(Bitmap bmp, int x, int y) {
    this.bitmap = bmp;
    this.x = x;
    this.y = y;
    halfBmpX = bmp.getWidth() / 2;
    halfBmpY = bmp.getHeight() / 2;
}

说明:类的开头的那些初始化是在构造函数运行之前运行的,因此bitmap不存在于null引用之外的其他任何内容。< / p>

答案 1 :(得分:2)

您尝试在分配之前调用位图上的方法,它仍然是null

int halfBmpX = bitmap.getWidth() /2;

您应该在构造函数中移动以下两行:

halfBmpX = bitmap.getWidth() /2;
halfBmpY = bitmap.getHeight() /2;

并将它们的声明保留在构造函数之外:

int halfBmpX, halfBmpY;

答案 2 :(得分:1)

您的Orb课程中包含以下代码:

private Bitmap bitmap;  //image
private int x;  //x coord
private int y;  //y coord
private boolean touched; //if orb is touched/picked up
//just to make things simpler to read
int halfBmpX = bitmap.getWidth() /2;
int halfBmpY = bitmap.getHeight() /2;

您在没有初始化的情况下对bitmap对象进行了两次引用。您应该在构造函数中设置halfBmpXhalfBmpY

答案 3 :(得分:1)

在您的Orb课程的Line 13 & 14中,您可以执行此操作

int halfBmpX = bitmap.getWidth() /2;
int halfBmpY = bitmap.getHeight() /2;

bitmap尚未初始化时为null,因此为空指针异常。

bitmap.getWidth() /2;初始化之后,在构造函数中移动右bitmap位。