诊断a";RuntimeException:无法启动活动,原因是:java.lang.NullPointerException“;

诊断a";RuntimeException:无法启动活动,原因是:java.lang.NullPointerException“;,java,android,runtime,nullpointerexception,Java,Android,Runtime,Nullpointerexception,我不知道该怎么办,我正在学习一个android教程,在最新的更新中,我遇到了一个运行时错误,我真的很难找到它的来源 我的目标是在屏幕左下角出现一个小的“球体”图标,玩家可以在屏幕上拖放 自从上次成功编译以来,我只对程序做了一些更改。所有这些都在GameView类中,您可以在此处看到:。我还创建了一个名为Orb的全新类,在这里: 如果你有android开发经验,那么查看我的代码应该不会太麻烦,但是我感谢任何花时间提出建议的人!所有建议将不胜感激 logcat这样说: FATAL EXCEPTIO

我不知道该怎么办,我正在学习一个android教程,在最新的更新中,我遇到了一个运行时错误,我真的很难找到它的来源

我的目标是在屏幕左下角出现一个小的“球体”图标,玩家可以在屏幕上拖放

自从上次成功编译以来,我只对程序做了一些更改。所有这些都在GameView类中,您可以在此处看到:。我还创建了一个名为Orb的全新类,在这里:

如果你有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
类尝试从
null
引用初始化
halfBmpX
(和
Y

该初始化应在拥有有效的
位图
进行初始化后在构造函数中进行

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;
}

说明:类开头的那些初始化是在构造函数运行之前运行的,因此
位图
除了
null
引用之外不存在任何其他形式。

您的
Orb
类尝试从
null
引用初始化
halfBmpX
(和
Y

该初始化应在拥有有效的
位图
进行初始化后在构造函数中进行

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
引用以外的任何东西存在。

您尝试在位图上调用一个方法,但它仍然是
null

int halfBmpX = bitmap.getWidth() /2;
您应该在构造函数中移动以下两行:

halfBmpX = bitmap.getWidth() /2;
halfBmpY = bitmap.getHeight() /2;
int halfBmpX, halfBmpY;
并将其声明保存在建造商之外:

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

您尝试在分配位图之前对其调用一个方法,但该方法仍然是
null

int halfBmpX = bitmap.getWidth() /2;
您应该在构造函数中移动以下两行:

halfBmpX = bitmap.getWidth() /2;
halfBmpY = bitmap.getHeight() /2;
int halfBmpX, halfBmpY;
并将其声明保存在建造商之外:

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

您的
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;
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;

您已经对
位图
对象进行了两次引用,但没有对其进行初始化。您应该改为在构造函数中设置
halfBmpX
halfBmpY

您的
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;
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;

您已经对
位图
对象进行了两次引用,但没有对其进行初始化。您应该在构造函数中设置
halfBmpX
halfBmpY

在您的Orb类的
第13行和第14行中,您可以这样做

int halfBmpX = bitmap.getWidth() /2;
int halfBmpY = bitmap.getHeight() /2;
位图
尚未初始化且为空时,则会出现空指针异常


向右移动
bitmap.getWidth()/2位图之后,构造函数中的code>位。

在Orb类的
第13行和第14行中执行此操作

int halfBmpX = bitmap.getWidth() /2;
int halfBmpY = bitmap.getHeight() /2;
位图
尚未初始化且为空时,则会出现空指针异常


向右移动
bitmap.getWidth()/2位图之后,构造函数中的code>位。

不是
int
部分,否则它们将是本地的。@DᴀᴠᴇNᴇᴡᴛᴏɴ-是的,复制粘贴错误。谢谢不是
int
部分,否则它们将是本地的。@DᴀᴠᴇNᴇᴡᴛᴏɴ-是的,复制粘贴错误。谢谢啊!这样愚蠢的错误!我得到了许多正确的回答,我感谢大家的关注@霍莉:它发生了:)不过,在未来,最好提供有问题的源代码,以避免不得不挖掘它——我们相当懒惰。DOH!这样愚蠢的错误!我得到了许多正确的回答,我感谢大家的关注@霍莉:)不过,在未来,最好提供有问题的源代码,以避免需要挖掘——我们相当懒惰。