2017-06-16 111 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

相关问题