0

アクティビティに到達していくつかのintを変更しようとすると、nullpointerexceptionが発生します。これはどのように見えるかです: MainActivity.java

    public class MainActivity extends Activity {

    public static SoundManager mSoundManager = new SoundManager();

    private static final String TAG = MainActivity.class.getSimpleName();


     private MainGamePanel gamePanel;
     SharedPreferences myPrefs;

     public int win = 0;
     public int fail = 0;

     int wins = 0;
     int fails = 0;



    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    // requesting to turn the title OFF
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    // making it full screen
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    // set our MainGamePanel as the View
    setContentView(new MainGamePanel(this));

    myPrefs = this.getSharedPreferences("hgbdata", 0);

        try {
        wins = myPrefs.getInt("wins", 0);
        fails = myPrefs.getInt("fails", 0);
        if ((wins != 0) && (fails != 0)) {
        gamePanel.winn = wins;
        gamePanel.failn = fails;
        }
        } catch (NullPointerException npe) {
            Log.d(TAG, "Nothing to load");
        }

    //INIT SOUND
    mSoundManager.initSounds(getBaseContext());
    //SOUNDS
    mSoundManager.addSound(1, R.raw.draw);
    mSoundManager.addSound(2, R.raw.cheer);
    mSoundManager.addSound(3, R.raw.boo);

    }

. . .


public void win() {
    win++;
}

public void fail() {
    fail++;
}



}

これは私がアクティビティに到達しようとしているところです: MainGamePanel.java

public class MainGamePanel extends SurfaceView implements
SurfaceHolder.Callback {

private static final String TAG = MainGamePanel.class.getSimpleName();

private MainThread thread;
private MainActivity activity;

. . .

public void update() {

//somewhere inside the update()
activity.win();

. . .

activity.fail();

}

}

これはログです:

11-18 10:23:47.336: D/MainThread(1190): Starting game loop
11-18 10:23:47.336: D/MainThread.initTimingElements()(1190): Timing elements for stats initialised
11-18 10:23:47.386: D/gralloc_goldfish(1190): Emulator without GPU emulation detected.
11-18 10:24:19.925: D/dalvikvm(1190): GC_CONCURRENT freed 356K, 2% free 28540K/28999K, paused 132ms+30ms, total 441ms
11-18 10:24:20.965: W/dalvikvm(1190): threadid=13: thread exiting with uncaught exception (group=0x40a13300)
11-18 10:24:20.965: E/AndroidRuntime(1190): FATAL EXCEPTION: Thread-105
11-18 10:24:20.965: E/AndroidRuntime(1190): java.lang.NullPointerException
11-18 10:24:20.965: E/AndroidRuntime(1190):     at com.nti.hanga.gubbe.MainGamePanel.update(MainGamePanel.java:591)
11-18 10:24:20.965: E/AndroidRuntime(1190):     at com.nti.hanga.gubbe.MainThread.run(MainThread.java:92)
11-18 10:24:21.235: I/AndroidRuntime(1190): VM exiting with result code 0, cleanup skipped.

MainGamePanel.java:591activity.win();

ご協力ありがとうございました。

4

2 に答える 2

1

SurfaceViewからアクティビティを参照しようとさえしないでください。

インターフェイスを定義し、コールバックを使用して、ゲームが終了したことをアクティビティに通知します。

public Interface GameOverListener {
    void onGameOver(boolean won);
}

カスタムサーフェスビューで

ArrayList<GameOverListener > listeners = new ArrayList<GameOverListener >();

...

public void setGameOverListener(GameOverListener listener){
    listeners.add(listener);
}

更新イベントで

for (GameOverListener listener:listeners){
   listener.onGameOver(gameWon?true:false); // here you pass true if they won, false if they lost
}

あなたの活動で:

public class MainActivity extends Activity implements GameOverListener {

...

@Override
public void onCreate(Bundle savedInstanceState) 
{
    ... 
    gamePanel.setGameOverListener(this);
    ...
}

public void onGameOver(boolean won){
   if (won){
      // they won!
   } else {
      // they lost!
   }
}

removeGameOverListenerを追加し、setGameOverListenerに同じリスナーを2回追加しないことを確認することで、サーフェスビュークラスを改善できます。

于 2012-11-18T10:55:33.710 に答える
0

activity.win()またはactivity.fail()がファイルの行591にある場合MainGamePanel.java、それはおそらくそれを意味しactivity == nullます。初期化してもよろしいですか?

于 2012-11-18T10:42:42.763 に答える