2017-06-16 201 views
-1

我很確定我的XML或清單中沒有問題。問題必須出現在我的代碼中(因爲我稍微更改了代碼並停止工作)。該應用程序甚至開始之前崩潰。我得到的錯誤是:不幸的是,該應用程序已停止Android Studio

了java.lang.RuntimeException:無法啓動活動 ComponentInfo {com.trainer.braintrainer/com.trainer.braintrainer.MainActivity}: 顯示java.lang.NullPointerException:試圖調用上的空 對象引用 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 在 android.app虛擬方法 '無效 android.widget.Button.setText(java.lang.CharSequence中)'。 ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.ap在android.android.os.Handler.dispatchMessage(Handler.java:102) android.app.ActivityThread $ H.handleMessage os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android。 internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起來自:java.lang.NullPointerException:Att搶先在調用虛擬方法 「空隙android.widget.Button.setText(java.lang.CharSequence中)」上 在 com.trainer.braintrainer.MainActivity.generateQuestion(MainActivity.java:60)空對象引用 com.trainer.braintrainer.MainActivity.onCreate(MainActivity.java:101) 在android.app.Activity.performCreate(Activity.java:6237) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java .lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)06-16 08:01:16.547 24091-24091/com.trainer.braintrainer I/Process:發送 信號。PID:24091 SIG:9

下面是我主要的Java代碼:

package com.trainer.braintrainer; 

import android.os.CountDownTimer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import org.w3c.dom.Text; 

import java.util.ArrayList; 
import java.util.Random; 

public class MainActivity extends AppCompatActivity { 
    ArrayList<Integer> answers=new ArrayList<Integer>(); 
    Random rand = new Random(); 

    int locationOfCorrectAnswer; 
    Button startButton; 
    Button button0; 
    Button button1; 
    Button button2; 
    Button button3; 
    int score=0; 
    int numberOfQuestions=0; 
    TextView answerMessage; 
    String message; 
    TextView scoreText; 
    TextView sumTextView; 
    TextView timerText; 

    public void generateQuestion(){ 

     int a=rand.nextInt(21); 
     int b=rand.nextInt(21); 

     sumTextView.setText(Integer.toString(a) + " + " + Integer.toString(b)); 

     locationOfCorrectAnswer=rand.nextInt(4); 
     answers.clear(); 
     int inCorrectAns; 
     for (int i=0;i<=3;i++){ 
      if (i==locationOfCorrectAnswer){ 
       answers.add(a+b); 
      }else{ 
       inCorrectAns=rand.nextInt(50); 
       while (inCorrectAns==a+b){ 
        inCorrectAns=rand.nextInt(50); 

       } 
       answers.add(inCorrectAns); 
      } 
     } 
     button0.setText(Integer.toString(answers.get(0))); 
     button1.setText(Integer.toString(answers.get(1))); 
     button2.setText(Integer.toString(answers.get(2))); 
     button3.setText(Integer.toString(answers.get(3))); 
    } 

    public void startButton(View view){ 
     startButton.setVisibility(View.INVISIBLE); 
    } 
    public void answerFunction(View view){ 
     int tappedLocation= (int)view.getTag(); 

     if (tappedLocation==locationOfCorrectAnswer){ 
      message="Correct!"; 
      score++; 
     }else{ 
      message="Wrong!"; 
     } 
     answerMessage.setText(message); 
     scoreText.setText(Integer.toString(score) + "/" + Integer.toString(numberOfQuestions)); 
     numberOfQuestions++; 
     generateQuestion(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     startButton=(Button)findViewById(R.id.button5); 
     answerMessage=(TextView)findViewById(R.id.messageView); 
     sumTextView=(TextView)findViewById(R.id.sumTextView); 
     scoreText=(TextView)findViewById(R.id.scoreText); 
     timerText=(TextView)findViewById(R.id.timerText); 

     generateQuestion(); 
     new CountDownTimer(30100,1000){ 

      @Override 
      public void onTick(long millisUntilFinished) { 
       int seconds=(int) millisUntilFinished/1000; 
       timerText.setText(Integer.toString(seconds)+"s"); 
      } 

      @Override 
      public void onFinish() { 
       answerMessage.setText("Done"); 
      } 
     }.start(); 
     button0=(Button)findViewById(R.id.ans1); 
     button1=(Button)findViewById(R.id.ans2); 
     button2=(Button)findViewById(R.id.ans3); 
     button3=(Button)findViewById(R.id.ans4); 
    } 
} 
+2

你添加一個斷點到崩潰的第一個活動之前分配給該按鈕的各自的看法?你看到代碼有多遠?你最近有沒有改變一些東西來實現這一點?這個問題很可能在你的XML中。 –

+0

'嘗試在空對象引用上調用虛擬方法'void android.widget.Button.setText(java.lang.CharSequence)'意味着你試圖調用'setText'方法的變量未被賦值。檢查所有變量是否正在分配_before_他們使用。 – Clonkex

+0

此外,你說_「因爲我稍微改變了我的代碼,它停止了工作」_...你什麼改變了?認真的說,這應該是一個很大的線索,你看起來第一個地方。 – Clonkex

回答

0

您所呼叫的方法generateQuestion();在爲按鈕分配值之前:button1,button2等。在這些按鈕上執行setText時,它會引發空對象引用錯誤。你可以做的是:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    startButton=(Button)findViewById(R.id.button5); 
    answerMessage=(TextView)findViewById(R.id.messageView); 
    sumTextView=(TextView)findViewById(R.id.sumTextView); 
    scoreText=(TextView)findViewById(R.id.scoreText); 
    timerText=(TextView)findViewById(R.id.timerText); 

    button0=(Button)findViewById(R.id.ans1); 
    button1=(Button)findViewById(R.id.ans2); 
    button2=(Button)findViewById(R.id.ans3); 
    button3=(Button)findViewById(R.id.ans4); 

    generateQuestion(); 
    new CountDownTimer(30100,1000){ 

     @Override 
     public void onTick(long millisUntilFinished) { 
      int seconds=(int) millisUntilFinished/1000; 
      timerText.setText(Integer.toString(seconds)+"s"); 
     } 

     @Override 
     public void onFinish() { 
      answerMessage.setText("Done"); 
     } 
    }.start(); 

} 
} 

正在調用generateQuestion()

+0

我根據@ Shubham的建議進行了更正,現在,我在getFag中的answerFunction中獲得了null值。這有什麼問題? – nirakar07

+0

你在哪裏準確設置標籤?你需要使用setTag()或android:tag(在xml中)getTag()才能正常工作 –

+0

我在xml中添加了標籤,它工作正常。希望此主題將幫助其他需要幫助的人:) – nirakar07

相關問題