2010-12-31 13 views
1

私はアプリケーションで作業しており、オプションメニューを追加しました。メニューを追加する前に、すべて正常に動作しましたが、追加した後は実行されません。プロセスは停止します。 メニューを削除しようとしましたが、動作しませんでしたが、それはまだ停止します。 logcatには、nullポインタの例外があると言われていますが、なぜこれが起きているのかは全く分かりません。オプションメニューを追加しました。プロセスは終了しました。

私numbers_menu xmlファイル:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:id="@+id/quit" 
    android:title="@string/quit_str" ></item> 

<item android:id="@+id/instructions" 
     android:title="@string/instructions_str"></item> 

</menu> 

方法:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.numbers_menu, menu); 
    return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.quit: 
      quit(); 
      return true; 
     case R.id.instructions: 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
     } 
    } 

ここでは、nullポインタ例外をリードするコードです:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    play_game(); 

    } 

public void play_game() { 

    //get some numbers 
    rolled1 = roll(); 
    Log.d(TAG, "rolled1 is up"); 
    rolled2 = roll(); 
    Log.d(TAG, "rolled2 is up"); 

     switch(rolled1) { 
    case 1: 
     rolled_id_1 = 2131034114; 
     break; 
    case 2: 
     rolled_id_1 = 2131034115; 
     break; 
    case 3: 
     rolled_id_1 = 2131034116; 
     break; 
    case 4: 
     rolled_id_1 = 2131034117; 
     break; 
    case 5: 
     rolled_id_1 = 2131034119; 
     break; 
    case 6: 
     rolled_id_1 = 2131034120; 
     break; 
    } 

     Log.d(TAG, "rolled_id_1 is up with the value " + Integer.toString(rolled_id_1)); 

    switch(rolled2) { 
    case 1: 
     rolled_id_2 = 2131034114; 
     break; 
    case 2: 
     rolled_id_2 = 2131034115; 
     break; 
    case 3: 
     rolled_id_2 = 2131034116; 
     break; 
    case 4: 
     rolled_id_2 = 2131034117; 
     break; 
    case 5: 
     rolled_id_2 = 2131034119; 
     break; 
    case 6: 
     rolled_id_2 = 2131034120; 
     break; 
    } 

    Log.d(TAG, "rolled_id_2 is up with the value " + Integer.toString(rolled_id_2)); 

    switch(rolled1 + rolled2) { 
    case 1: 
     rolled_sum = 2131034114; 
     break; 
    case 2: 
     rolled_sum = 2131034115; 
     break; 
    case 3: 
     rolled_sum = 2131034116; 
     break; 
    case 4: 
     rolled_sum = 2131034117; 
     break; 
    case 5: 
     rolled_sum = 2131034119; 
     break; 
    case 6: 
     rolled_sum = 2131034120; 
     break; 
    case 7: 
     rolled_sum = 2131034121; 
     break; 
    case 8: 
     rolled_sum = 2131034122; 
     break; 
    case 9: 
     rolled_sum = 2131034124; 
     break; 
    case 10: 
     rolled_sum = 2131034125; 
     break; 
    case 11: 
     rolled_sum = 2131034126; 
     break; 
    case 12: 
     rolled_sum = 2131034127; 
     break; 
    } 

    Log.d(TAG, "rolled_id_sum is up with the value " + Integer.toString(rolled_sum)); 

    if(lose(rolled_id_1, rolled_id_2, rolled_sum)) { 
     dieShow(rolled1, rolled2); 
     setContentView(R.layout.main); 
     play_game(); 
    } 
    else { 
      disable_flag = 0; 
      needDisable(rolled_id_1, rolled_id_2); 
      dieShow(rolled1, rolled2); 
     } 



     } 

public boolean lose(int rolled_id_1, int rolled_id_2, int rolled_sum) { 
    //check loss 
    Button button_check_loss_1 = (Button)findViewById(rolled_id_1); 
    Log.d(TAG, "getting past first button assignment"); 
    Button button_check_loss_2 = (Button)findViewById(rolled_id_2); 
    Log.d(TAG, "getting past second button assignment"); 
    Button button_check_loss_3 = (Button)findViewById(rolled_sum); 
    Log.d(TAG, "getting past third button assignment"); 

    if((!button_check_loss_1.isClickable() || !button_check_loss_2.isClickable()) && !button_check_loss_3.isClickable()) { 
     Toast loseText = Toast.makeText(this, "you lose1", Toast.LENGTH_LONG); 
     loseText.show(); 
     return true; 
    } 

    if(!button_check_loss_1.isClickable() && !button_check_loss_2.isClickable() && !button_check_loss_3.isClickable()) { 
     Toast loseText = Toast.makeText(this, "you lose2", Toast.LENGTH_LONG); 
     loseText.show(); 
     return true; 

    } 

    if(rolled_id_1 == rolled_id_2) { 
     if ((!button_check_loss_1.isClickable() || !button_check_loss_2.isClickable()) && !button_check_loss_3.isClickable()) { 
      Toast loseText = Toast.makeText(this, "you lose3", Toast.LENGTH_LONG); 
      loseText.show(); 
      return true; 
     } 
    } 

    return false; 

    } 

エラーがで発生します。

if((!button_check_loss_1.isClickable() || !button_check_loss_2.isClickable()) && !button_check_loss_3.isClickable()) 

答えて

1
case 1: 
    rolled_id_1 = 2131034114; 
    break; 

私は推測してみましょう... 2131034114あなたが/gen/.../R.javaから取得したボタンのIDです - 正しいですか?

もしそうなら、これは本当に良いことではありません。生成されたR.javaファイルの内容は定数であることが保証されていません。オプションメニューを追加することによって、ボタンのすべて(または一部)のIDが変更されている可能性があります。

あなたはNullPointerExceptionが取得している理由は、このコードである可能性が高い...

Button button_check_loss_1 = (Button)findViewById(rolled_id_1); 
Log.d(TAG, "getting past first button assignment"); 
Button button_check_loss_2 = (Button)findViewById(rolled_id_2); 
Log.d(TAG, "getting past second button assignment"); 
Button button_check_loss_3 = (Button)findViewById(rolled_sum); 
Log.d(TAG, "getting past third button assignment"); 

は...おそらく、これらのボタンIDの1つ(またはすべてを)見つけることができません。 rolled_id_1に割り当てるときは、R.id.button1(たとえば)を使用する必要があります。

+0

ありがとうございました! Integer.toString(v.getId())は、必要な方法ではないと感じましたが、すべてをR.idに変更しました。

+0

@valon:心配しなくても、うれしいことはあなたのために解決されました...将来的に自動生成されたものから離れてください。 :D – Squonk

関連する問題