2012-12-10 5 views
0

내 onTick() 메서드에서 2 줄에 NullPointer 오류가 발생했습니다. 서브 클래스를 구현하고이 타이머를 작동시키는 방법에 익숙하지 않습니다. CountDownTimers를 봤는데 찾았던 예제를 구현하려 했으니 지저분해질 수 있습니다.퀴즈 게임에서 CountDownTimer, NullPointer - 안드로이드 (자바)

타이머를 구현하기 전에 앱이 훌륭하게 작동했습니다. 내가 원하는 것은이 활동이 시작되면 바로 타이머를 시작한 다음 타이머를 다시 시작하고 클릭이나 타이머가 만료 된 후에 새로운 질문을 표시하는 것입니다.

미리 감사드립니다.

public class QuestionView extends Activity { 

    int correctAnswers = 0; 
    int wrongAnswers = 0; 

    int answer = 0; 

    int i = 0; 

    long startTime = 50000; 
    long interval = 1000; 
    long timeElapsed; 

    boolean timerHasStarted = false; 

    Button answer1; 
    Button answer2; 
    Button answer3; 
    Button answer4; 
    TextView question; 
    TextView timer; 
    TextView timeElapsedView; 

    ArrayList<Question> queries; 
    Timer cdTimer; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.questionviewmain); 

     answer1 = (Button)findViewById(R.id.answer1); 
     answer2 = (Button)findViewById(R.id.answer2); 
     answer3 = (Button)findViewById(R.id.answer3); 
     answer4 = (Button)findViewById(R.id.answer4); 

     question = (TextView)findViewById(R.id.question); 

     queries = getIntent().getParcelableArrayListExtra("queries"); 

     cdTimer = new Timer(startTime, interval); 

     loadQuestion(); 
    } 

    public void loadQuestion() { 

     if(i == 9) { 

      endQuiz(); 

     } else { 

      if(!timerHasStarted) { 
       cdTimer.start(); 
       timerHasStarted = true; 
      } else { 
       cdTimer.cancel(); 
       timerHasStarted = false; 
      } 

      answer = queries.get(i).getCorrectAnswer(); 

      question.setText(queries.get(i).getQuery()); 

      answer1.setText(queries.get(i).getA1()); 
      answer2.setText(queries.get(i).getA2()); 
      answer3.setText(queries.get(i).getA3()); 
      answer4.setText(queries.get(i).getA4()); 

      answer1.setOnClickListener(new OnClickListener() { 
       public void onClick(View arg0) { 
        queries.get(i).setSelectedAnswer(0); 
        if(answer == 0) { 
         correctAnswers++; 
         nextQuestion(); 
        } else { 
         wrongAnswers++; 
         nextQuestion(); 
        } 
       } 
      }); 

      answer2.setOnClickListener(new OnClickListener() { 
       public void onClick(View arg0) { 
        queries.get(i).setSelectedAnswer(1); 
        if(answer == 1) { 
         correctAnswers++; 
         nextQuestion(); 
        } else { 
         wrongAnswers++; 
         nextQuestion(); 
        } 
       } 
      }); 

      answer3.setOnClickListener(new OnClickListener() { 
       public void onClick(View arg0) { 
        queries.get(i).setSelectedAnswer(2); 
        if(answer == 2) { 
         correctAnswers++; 
         nextQuestion(); 
        } else { 
         wrongAnswers++; 
         nextQuestion(); 
        } 
       } 
      }); 

      answer4.setOnClickListener(new OnClickListener() { 
       public void onClick(View arg0) { 
        queries.get(i).setSelectedAnswer(3); 
        if(answer == 3) { 
         correctAnswers++; 
         nextQuestion(); 
        } else { 
         wrongAnswers++; 
         nextQuestion(); 
        } 
       } 
      }); 
     } 
    } 

    public int getCorrectAnswers() { return correctAnswers; } 
    public int getWrongAnswers() { return wrongAnswers; } 

    public ArrayList<Question> getQueries() { 
     return queries; 
    } 

    public void nextQuestion() { 
     i++; 
     loadQuestion(); 
    } 

    public class Timer extends CountDownTimer { 

     public Timer(long starttime, long interval) { 
      super(startTime, interval); 
     } 

     @Override 
     public void onFinish() { 
      timer.setText("Time's up!"); 
      timeElapsedView.setText("Time Elapsed: " + String.valueOf(startTime)); 
     } 

     @Override 
     public void onTick(long millisUntilFinished) { 
      timer.setText("Time remain: " + millisUntilFinished); 
      timeElapsed = startTime - millisUntilFinished; 
      timeElapsedView.setText("Time Elapsed: " + String.valueOf(timeElapsed)); 
     } 
    } 

    public void endQuiz() { 
     Intent intent = new Intent(QuestionView.this, Results.class); 
     intent.putExtra("correctAnswers", correctAnswers); 
     intent.putExtra("wrongAnswers", wrongAnswers); 
     intent.putParcelableArrayListExtra("queries", queries); 
     startActivity(intent); 
    } 


} 

로그 캣

12-05 07:32:06.142: E/AndroidRuntime(6264): FATAL EXCEPTION: main 
12-05 07:32:06.142: E/AndroidRuntime(6264): java.lang.NullPointerException 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at com.example.test.QuestionView$Timer.onTick(QuestionView.java:164) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:124) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at android.os.Looper.loop(Looper.java:137) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-05 07:32:06.142: E/AndroidRuntime(6264):  at dalvik.system.NativeStart.main(Native Method) 
+0

게시하여 로그 캣 오류를 변경해야합니다. – Sam

+0

"내 줄 2 개에 NullPointer 오류가 있습니다."어떤 줄에서 오류가 발생하는지 짐작할 수있는 간단한 게임의 일부입니까? –

+0

오류가 onTick 메서드에 있고 NullPointer라고 말했지만 LogCat 출력으로 시작 게시물을 편집했습니다. – Matt

답변

1

이 유일한 문제가되지 않을 수 있지만 timer 또는 timeElapsedView를 초기화하지 않았습니다.

당신은 onCreate()이 같은 뭔가가 필요 : 당신이 finish()onTick()의 텍스트를 설정하려고하면

timer = (TextView) findViewById(R.id.timer); 
timeElapsedView = (TextView) findViewById(R.id.timeelapsedView); 
0

난 당신이

timeElapsedView = (TextView) findViewById(R.id.idOfYourTextView)

그래서 텍스트 뷰 초기화 경우 표시되지 않습니다

0

타이머를 초기화하지 않을 텍스트가 없습니다. 그래서 그것은 null이므로 NPE를 얻습니다. 우리가 뭐가 잘못 추측 할 필요가 없습니다

0

또한

public Timer(long starttime, long interval) { 
      super(startTime, interval); 
     } 

public Timer(long startTime, long interval) { 
      super(startTime, interval); 
     }