算术Android应用程序崩溃,代码中没有错误

时间:2017-03-13 18:53:42

标签: java android

我正在制作Android应用,它应该要求算术方程并检查答案。应该有不同的难度级别。从AlertDialog中选择难度级别时,我的应用会崩溃。我在Android Studio中没有错误。

以下是选择级别的代码:

public void onClick(View view) {
    if(view.getId()==R.id.play_btn){
        //play button
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Choose a level")
                .setSingleChoiceItems(levelNames, 0, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        //start gameplay
                        startPlay(which);
                    }
                });
        AlertDialog ad = builder.create();
        ad.show();
    }

private void startPlay(int chosenLevel){
    //start gameplay
    Intent playIntent = new Intent(this, PlayGame.class);
    playIntent.putExtra("level", chosenLevel);
    this.startActivity(playIntent);
}

有人可以帮助我理解我的应用崩溃的原因吗?

这是日志:

9758-9758/org.example.braintraining E/AndroidRuntime: FATAL EXCEPTION: main
                                                                     Process: org.example.braintraining, PID: 9758
                                                                     java.lang.RuntimeException: Unable to start activity ComponentInfo{org.example.braintraining/org.example.braintraining.PlayGame}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
                                                                         at android.app.ActivityThread.access$900(ActivityThread.java:177)
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                         at android.os.Looper.loop(Looper.java:145)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5942)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at java.lang.reflect.Method.invoke(Method.java:372)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
                                                                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.Bundle.getInt(java.lang.String)' on a null object reference
                                                                         at org.example.braintraining.PlayGame.onCreate(PlayGame.java:104)
                                                                         at android.app.Activity.performCreate(Activity.java:6289)
                                                                         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) 
                                                                         at android.app.ActivityThread.access$900(ActivityThread.java:177) 
                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                         at android.os.Looper.loop(Looper.java:145) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5942) 
                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                         at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183) 

以下是onCreatePlayGame方法的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_playgame);
    gamePrefs = getSharedPreferences(GAME_PREFS, 0);

    //text and image views
    question = (TextView)findViewById(R.id.question);
    answerTxt = (TextView)findViewById(R.id.answer);
    response = (ImageView)findViewById(R.id.response);
    scoreTxt = (TextView)findViewById(R.id.score);

    //hide tick cross initially
    response.setVisibility(View.INVISIBLE);

    //number, enter and clear buttons
    btn1 = (Button)findViewById(R.id.btn1);
    btn2 = (Button)findViewById(R.id.btn2);
    btn3 = (Button)findViewById(R.id.btn3);
    btn4 = (Button)findViewById(R.id.btn4);
    btn5 = (Button)findViewById(R.id.btn5);
    btn6 = (Button)findViewById(R.id.btn6);
    btn7 = (Button)findViewById(R.id.btn7);
    btn8 = (Button)findViewById(R.id.btn8);
    btn9 = (Button)findViewById(R.id.btn9);
    btn0 = (Button)findViewById(R.id.btn0);
    enterBtn = (Button)findViewById(R.id.enter);
    clearBtn = (Button)findViewById(R.id.clear);

    //listen for clicks
    btn1.setOnClickListener(this);
    btn2.setOnClickListener(this);
    btn3.setOnClickListener(this);
    btn4.setOnClickListener(this);
    btn5.setOnClickListener(this);
    btn6.setOnClickListener(this);
    btn7.setOnClickListener(this);
    btn8.setOnClickListener(this);
    btn9.setOnClickListener(this);
    btn0.setOnClickListener(this);
    enterBtn.setOnClickListener(this);
    clearBtn.setOnClickListener(this);

    //get passed level number
    if(savedInstanceState!=null){
        //restore state
    }
    else{
        Bundle extras = getIntent().getExtras();
        if(extras !=null)
        {
            int passedLevel = extras.getInt("level", -1);
            if(passedLevel>=0) level = passedLevel;
            level=savedInstanceState.getInt("level");
            int exScore = savedInstanceState.getInt("score");
            scoreTxt.setText("Score: "+exScore);
        }
    }

    //initialize random
    random = new Random();
    //play
    chooseQuestion();
}

1 个答案:

答案 0 :(得分:0)

引起:java.lang.NullPointerException:尝试在org.example.braintraining.PlayGame.onCreate的空对象引用上调用虚方法'int android.os.Bundle.getInt(java.lang.String)'( PlayGame.java:10 4)

在两种情况下,代码可能都失败了:

  
      
  1. 您正在通过传递playIntent开始新的活动。请检查PlayGame.java中的代码,在onCreate()中你应该从Intent而不是Bundle中获取字符串值(级别),比如
  2.   
 String chosenLevel;
 Intent i = this.getIntent();
 if(i != null){
  chosenLevel = i.getStringExtra("level");
 }
  

2.如果您正在旋转屏幕,一旦您处于游戏活动中,您在活动被销毁之前未保存所需的值,并且在重新创建活动后尝试将其检索回来。

解决方法是使用put方法在onSaveInstanceState()中存储值:

protected void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
bundle.putString("value", chosenLevel);
} 

从onCreate()中的Bundle恢复值,或者你可以使用在onStart()之后调用的onRestoreInstanceState(),而在onStart()之前调用onCreate()。:

public void onCreate(Bundle bundle) {
if (bundle!= null){
chosenValue = bundle.getString("value");
 } 
}