Диагностика «RuntimeException: невозможно запустить действие, вызванное: java.lang.NullPointerException» - PullRequest
0 голосов
/ 24 ноября 2011

Я не знаю, куда обратиться, я следовал учебному пособию по Android здесь , и при последнем обновлении я получаю ошибку во время выполнения, и я действительно изо всех сил пытаюсь найти ее источник!

То, к чему я стремлюсь, это маленький значок «шар», который должен появиться на экране в левой части экрана, чтобы игрок мог перетаскивать его по поверхности.

Теперь я только сделалнесколько изменений в программе с тех пор, как я последний раз успешно ее компилировал.Все они были в классе 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 ]

2 голосов
/ 24 ноября 2011

Вы пытаетесь вызвать метод в растровом изображении до того, как он был назначен, и он по-прежнему null:

int halfBmpX = bitmap.getWidth() /2;

Вам следует переместить следующие две строки в конструкторе:

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

и сохраняйте их объявление вне конструктора:

int halfBmpX, halfBmpY;
2 голосов
/ 24 ноября 2011

Ваш класс Orb пытается инициализировать halfBmpXY) из ссылки 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 ссылки.

1 голос
/ 24 ноября 2011

В Line 13 & 14 вашего класса Orb вы делаете это

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

, когда bitmap не инициализирован и является нулевым, следовательно, исключение пустого указателя.

Переместить вправоbitmap.getWidth() /2; битов внутри конструктора, после инициализации bitmap.

1 голос
/ 24 ноября 2011

В вашем классе 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 без его инициализации. Вместо этого вы должны установить halfBmpX и halfBmpY в конструкторе.

...