2

メニュー画面からアクティビティを起動するたびに、「致命的な例外:メイン」が発生します。他のいくつかのエラーとともに、ここにLogCatがあります

11-01 20:02:22.095: E/AndroidRuntime(272): FATAL EXCEPTION: main
11-01 20:02:22.095: E/AndroidRuntime(272): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{the.Newboston/the.Newboston.Snake_Basic}: java.lang.NullPointerException
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.os.Looper.loop(Looper.java:123)
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.app.ActivityThread.main(ActivityThread.java:4627)
11-01 20:02:22.095: E/AndroidRuntime(272):  at java.lang.reflect.Method.invokeNative(Native Method)
11-01 20:02:22.095: E/AndroidRuntime(272):  at java.lang.reflect.Method.invoke(Method.java:521)
11-01 20:02:22.095: E/AndroidRuntime(272):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-01 20:02:22.095: E/AndroidRuntime(272):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-01 20:02:22.095: E/AndroidRuntime(272):  at dalvik.system.NativeStart.main(Native Method)
11-01 20:02:22.095: E/AndroidRuntime(272): Caused by: java.lang.NullPointerException
11-01 20:02:22.095: E/AndroidRuntime(272):  at the.Newboston.Snake_Basic.<init>(Snake_Basic.java:21)
11-01 20:02:22.095: E/AndroidRuntime(272):  at java.lang.Class.newInstanceImpl(Native Method)
11-01 20:02:22.095: E/AndroidRuntime(272):  at java.lang.Class.newInstance(Class.java:1429)
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
11-01 20:02:22.095: E/AndroidRuntime(272):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
11-01 20:02:22.095: E/AndroidRuntime(272):  ... 11 more

私のコードは

package the.Newboston;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;

public class Snake_Basic extends Activity implements OnTouchListener {

SnakeView padView;
float x, y;
Bitmap up_pad, down_pad, left_pad, right_pad, static_pad_temp, static_pad;
boolean isRunning = false;
int screen_width = padView.getWidth();
int screen_height = padView.getHeight();
int snake_screen_width = (screen_width / 4);
int d_pad_width = snake_screen_width;
int d_pad_height = d_pad_width;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    padView = new SnakeView(this);
    padView.setOnTouchListener(this);
    x = 0;
    y = 0;
    up_pad = BitmapFactory.decodeResource(getResources(),
            R.drawable.control_pad_up);
    down_pad = BitmapFactory.decodeResource(getResources(),
            R.drawable.control_pad_down);
    left_pad = BitmapFactory.decodeResource(getResources(),
            R.drawable.control_pad_left);
    right_pad = BitmapFactory.decodeResource(getResources(),
            R.drawable.control_pad_right);
    static_pad_temp = BitmapFactory.decodeResource(getResources(),
            R.drawable.control_pad_neutral);
    static_pad = Bitmap.createScaledBitmap(static_pad_temp, d_pad_width,
            d_pad_height, true);

    setContentView(padView);

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    padView.pause();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    padView.resume();
}

public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    x = event.getX();
    y = event.getY();
    return true;
}

public class SnakeView extends SurfaceView implements Runnable {

    SurfaceHolder ourHolder;
    int string_creator = 0;
    Thread ourThread = null;
    boolean isRunning = false;

    public SnakeView(Context context) {
        super(context);
        ourHolder = getHolder();
    }

    public void pause() {
        isRunning = false;
        while (true) {
            try {
                ourThread.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            break;
        }
        ourThread = null;
    }

    public void resume() {

        ourThread = new Thread(this);
        ourThread.start();

        isRunning = true;
    }

    public void run() {
        // TODO Auto-generated method stub
        while (isRunning) {
            if (!ourHolder.getSurface().isValid())
                continue;

            Canvas canvas = ourHolder.lockCanvas();
            canvas.drawRGB(02, 02, 150);

            if (x != 0 && y != 0) {
                canvas.drawBitmap(static_pad, x
                        - (static_pad.getWidth() / 2),
                        y - (static_pad.getHeight() / 2), null);
            }

            ourHolder.unlockCanvasAndPost(canvas);
        }
    }
}

}

誰かがエラーを見つけるためにふるいにかけることが多すぎるかどうかは完全に理解しています。私は初心者なので、おそらく初心者の間違いでしょう。ちなみに、実行前にエラーは発生していません(Eclipseでコーディングしています)。

4

3 に答える 3

3

padView値が設定される前にアクセスしています。そのため、参加していてNullPointerExceptionSnake_Basic.<init>(Snake_Basic.java:21)アクティビティをでインスタンス化できませんRuntimeException

onCreate()が設定された後、すべてのクラスメンバーの初期化をに移動しますpadView

于 2012-11-02T00:48:50.167 に答える
1

Snake_Basic以下のクラスの次の行を参照してください。

SnakeView padView;
float x, y;
Bitmap up_pad, down_pad, left_pad, right_pad, static_pad_temp, static_pad;
boolean isRunning = false;
int screen_width = padView.getWidth();

最初の行でを初期化padViewし、最後の行padView.getWidth();でそれを使用していないため、が発生していNullPointerExceptionます。padView上記の最初の行で初期化して修正してください。

于 2012-11-02T00:48:29.877 に答える
0

1)トレースバックと、対応するコードをありがとうございます。どちらも非常に貴重です。

2)トレースバックは、問題が「Snake_Basic.java」の21行目の「nullポインター例外」であることを示しています。

11-01 20:02:22.095: E/AndroidRuntime(272): Caused by: java.lang.NullPointerException
11-01 20:02:22.095: E/AndroidRuntime(272):  at the.Newboston.Snake_Basic.<init>(Snake_Basic.java:21)

3)21行目までカウントダウンすると、「padView.getWidth()」が「null」を返しているように見えます...そしてそれを参照しようとすると死にます。あなたのプログラムがそこまで進んだら、「padView.getHeight()」もおそらく失敗するだろうと私は思う。

Q:「padView」のインスタンスをどこで作成していますか?実際に成功しますか?

正常に作成されるまで、「padView」を使用しないようにしてください。

============推奨される変更============

public class Snake_Basic extends Activity implements OnTouchListener {

  // These members are implicitly initialized to "0" (numbers) or "null" (objects)
  // *DON'T* try to initialize any objects here
  SnakeView padView;
  float x, y;
  Bitmap up_pad, down_pad, left_pad, right_pad, static_pad_temp, static_pad;
  boolean isRunning = false;
  int screen_width, screen_height;
  ...
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    padView = new SnakeView(this);

    // Initialize stuff here, in your onCreate() method
    screen_width = padView.getWidth();
    screen_height = padView.getHeight();
    snake_screen_width = (screen_width / 4);
    d_pad_width = snake_screen_width;
    ...
于 2012-11-02T00:48:36.410 に答える