2014-09-02 65 views
0

我是新来的android编程,所以我正在开发一个测验应用程序的实践..每件事情都很好,但有一个错误,我找不到解决方案。问题是当第一个问题出现,如果我没有回答它,然后单击下一个按钮,它会给我错误java.lang.nullpointerException。我已经使用sqlite存储问题,并使用计时器作为时间完成所有单选按钮被禁用。Android测验应用程序错误

这里是我的代码:

private TextView tv_timer; 
    List<Question> question_list; 
    int score = 0; 
    int qid = 0; 
    Question currentQ; 
    TextView tv_question; 
    RadioButton rda,rdb,rdc,rdd,rde; 
    Button btn_next; 
    MyCount counter; 
    RadioGroup rg; 
    RadioButton answer; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv_timer = (TextView)findViewById(R.id.tv_timer); 
     counter = new MyCount(50000,1000); 
     QuizHelper qh = new QuizHelper(this); 
     question_list=qh.getAllQuestions(); 
     currentQ = question_list.get(qid); 
     tv_question = (TextView)findViewById(R.id.tv_question); 
     rda = (RadioButton)findViewById(R.id.radio1); 
     rdb = (RadioButton)findViewById(R.id.radio2); 
     rdc = (RadioButton)findViewById(R.id.radio3); 
     rdd = (RadioButton)findViewById(R.id.radio4); 
     rde = (RadioButton)findViewById(R.id.radio5); 
     btn_next = (Button)findViewById(R.id.button1); 
     setQuestionView(); 

     btn_next.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) 
      { 
       try{ 

       rda.setChecked(false); 
       rdb.setChecked(false); 
       rdc.setChecked(false); 
       rdd.setChecked(false); 
       rde.setChecked(false); 

       rda.setClickable(true); 
       rdb.setClickable(true); 
       rdc.setClickable(true); 
       rdd.setClickable(true); 
       rde.setClickable(true); 

       rg = (RadioGroup)findViewById(R.id.RadioGroup1); 
       answer = (RadioButton)findViewById(rg.getCheckedRadioButtonId()); 

       if(currentQ.getANSWER().equals(answer.getText())) 
       { 
       score++; 
       } 
       if(qid < 5){ 
       currentQ = question_list.get(qid); 
       setQuestionView(); 
       } 
       else{ 
        Intent i = new Intent(MainActivity.this,ResultActivity.class); 
        Bundle b = new Bundle(); 
        b.putInt("score", score); 
        i.putExtras(b); 
        startActivity(i); 
        finish(); 
       } 
       }catch(Exception e){ 
        Log.d("Error","" + e); 
       } 
      } 
     }); 
    } 

    public void setQuestionView(){ 
     counter.start(); 
     tv_question.setText(currentQ.getQUESTION()); 
     rda.setText(currentQ.getOPTA()); 
     rdb.setText(currentQ.getOPTB()); 
     rdc.setText(currentQ.getOPTC()); 
     rdd.setText(currentQ.getOPTD()); 
     rde.setText(currentQ.getOPTE()); 
     qid++; 
    } 

    public class MyCount extends CountDownTimer{ 
     public MyCount(long millisInFuture, long countDownInterval) { 
     super(millisInFuture, countDownInterval); 
     } 
     @Override 
     public void onFinish() { 
     rda.setClickable(false); 
     rdb.setClickable(false); 
     rdc.setClickable(false); 
     rdd.setClickable(false); 
     rde.setClickable(false); 

     } 

有人请帮助:)

这里是logcat的:

09-02 01:13:58.958: D/AndroidRuntime(1348): Shutting down VM 
09-02 01:13:58.958: W/dalvikvm(1348): threadid=1: thread exiting with uncaught exception (group=0xb1b0aba8) 
09-02 01:13:59.018: E/AndroidRuntime(1348): FATAL EXCEPTION: main 
09-02 01:13:59.018: E/AndroidRuntime(1348): Process: com.example.challengeyourself, PID: 1348 
09-02 01:13:59.018: E/AndroidRuntime(1348): java.lang.NullPointerException 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at com.example.challengeyourself.MainActivity$1.onClick(MainActivity.java:84) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at android.view.View.performClick(View.java:4438) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at android.view.View$PerformClick.run(View.java:18422) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at android.os.Handler.handleCallback(Handler.java:733) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at android.os.Handler.dispatchMessage(Handler.java:95) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at android.os.Looper.loop(Looper.java:136) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at java.lang.reflect.Method.invoke(Method.java:515) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
09-02 01:13:59.018: E/AndroidRuntime(1348):  at dalvik.system.NativeStart.main(Native Method) 
09-02 01:14:02.588: I/Process(1348): Sending signal. PID: 1348 SIG: 9 
09-02 01:14:05.648: D/dalvikvm(1374): GC_FOR_ALLOC freed 58K, 5% free 3036K/3168K, paused 169ms, total 173ms 
09-02 01:14:05.698: I/dalvikvm-heap(1374): Grow heap (frag case) to 8.390MB for 5622016-byte allocation 
09-02 01:14:05.748: D/dalvikvm(1374): GC_FOR_ALLOC freed 2K, 2% free 8524K/8660K, paused 42ms, total 43ms 
09-02 01:14:06.328: D/gralloc_goldfish(1374): Emulator without GPU emulation detected. 
+0

你可以发布完整的logcat吗? NPE在哪条线上? – 2014-09-02 05:06:53

+0

请粘贴你的logcat – Jamil 2014-09-02 05:06:59

+0

Line MainActivity.java:84是? – 2014-09-02 05:17:46

回答

1

你得到NullPointerException

if(currentQ.getANSWER().equals(answer.getText())) 

,因为你没有选中任何单选按钮。 因此当时答案将为空。

将检查您尝试访问的答案的文字之前

if(answer != null){ 
    if(currentQ.getANSWER().equals(answer.getText())){ 
     //do something 
    } 
} 

希望这有助于。

P.S:始终初始化onCreate中的所有视图。这样,每次单击Next时,它们都将在onClick中初始化。这不是一个好习惯。

+0

非常感谢...问题已解决,它的工作完美。 ..再次感谢:) – awesum 2014-09-02 05:26:26

+0

很高兴我可以帮助@awesum :)快乐的编码。 – 2014-09-02 05:27:13

0

你初始化这些变量?

Button btn_next; 

这样

btn_next= (Button)findViewById(R.id.yourbutton); 

试着把这上面的代码在你的活动onCreate方法orjust你设定按钮的listinener前

btn_next= (Button)findViewById(R.id.yourbutton); 
btn_next.setOnClickListener(new View.OnClickListener().......... 

,我认为btn_next.setOnClickListiner所赐你没有初始化它的空指针异常。

0

初始化rganswer in onCreate方法,即在btn_next.setOnClickListener之前,因为这些是活动布局的一部分。

即重写为

rg = (RadioGroup)findViewById(R.id.RadioGroup1); 
answer = (RadioButton)findViewById(rg.getCheckedRadioButtonId()); 
btn_next.setOnClickListener(new View.OnClickListener() { 

,不要忘记删除

rg = (RadioGroup)findViewById(R.id.RadioGroup1); 
answer = (RadioButton)findViewById(rg.getCheckedRadioButtonId()); 

setOnClickListener

+0

我不认为这导致NPE。你不觉得吗?我同意他所使用的坏习惯。但问题在别的地方。 – 2014-09-02 05:13:19

+0

@Dhruti这些是活动布局的一部分,所以'findViewById'在'btn_next.setOnClickListener'中为null。 – 2014-09-02 05:15:33

+0

@Dhruti和在这一行中的空指针'if(currentQ.getANSWER()。equals(answer.getText()))' – 2014-09-02 05:16:47