Я работаю над приложением, и я добавил меню опций. Перед добавлением меню все было нормально, после добавления, однако, он не запускается, процесс просто прекращается. Я попытался удалить меню, и это не сработало, оно все равно останавливается. В logcat говорится, что существует исключение null-указателя, но я не могу понять, почему это происходит.
my 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);
}
}
Вот код, вызывающий исключение нулевого указателя:
@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())
case 1:
rolled_id_1 = 2131034114;
break;
Позвольте мне угадать... 2131034114 - это int Id кнопки, которую вы взяли из /gen/.../R.java - я прав?
Если это так, ДЕЙСТВИТЕЛЬНО НЕ - хороший способ сделать что-то. Содержимое сгенерированного файла R.java не гарантируется постоянным - добавив меню опций, вероятность того, что были изменены идентификаторы всех (или некоторых) кнопок.
Причина, по которой вы получаете исключение 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");
... вероятно, не может найти один (или все) этих идентификаторов кнопок. Вам нужно использовать R.id.button1 (например) при назначении rolled_id_1.