Android SQLite测验在两个问题之后崩溃,应该做五个

时间:2014-05-15 10:02:42

标签: android sqlite logcat

我正在创建一个测验应用程序,当应用程序应该经历5个问题时,它会在做两个问题后崩溃。我不确定为什么我按照教程来了解基础知识。这是QuizActivity

public class QuizActivity extends Activity
{
List<Question> quesList;
int score=0;
int qid=0;
Question currentQ;
TextView txtQuestion;
RadioButton rda, rdb, rdc;
Button butNext;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quiz);
    DBHelper db=new DBHelper(this);
    quesList=db.getAllQuestions();
    currentQ=quesList.get(qid);
    txtQuestion=(TextView)findViewById(R.id.textView1);
    rda=(RadioButton)findViewById(R.id.radio0);
    rdb=(RadioButton)findViewById(R.id.radio1);
    rdc=(RadioButton)findViewById(R.id.radio2);
    butNext=(Button)findViewById(R.id.button1);
    setQuestionView();
    butNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)
        {
            RadioGroup grp=(RadioGroup)findViewById(R.id.radioGroup1);
            RadioButton answer=(RadioButton)findViewById(grp.getCheckedRadioButtonId());
            if(currentQ.getANSWER().equals(answer.getText()))
            {
                score++;
            }
                currentQ=quesList.get(qid);
                setQuestionView();
                if(qid<5)
                {
                    currentQ=quesList.get(qid);
                    setQuestionView();
                }
                else
                {
                    Intent intent = new Intent(QuizActivity.this, ResultActivity.class);
                    Bundle b = new Bundle();
                    b.putInt("score", score); //Your score
                    intent.putExtras(b); //Put your score to your next Intent
                    startActivity(intent);
                    finish();
                }
        }

        });
}
private void setQuestionView()
{
    txtQuestion.setText(currentQ.getQUESTION());
    rda.setText(currentQ.getOPTA());
    rdb.setText(currentQ.getOPTB());
    rdc.setText(currentQ.getOPTC());
    qid++;
}

}

它推进到ResultsActivity

public class ResultActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_result);
    //get rating bar object
    RatingBar bar=(RatingBar)findViewById(R.id.ratingBar1);
    //get text view
    TextView t=(TextView)findViewById(R.id.textResult);
    //get score
    Bundle b = getIntent().getExtras();
    int score= b.getInt("score");
    //display score
    bar.setRating(score);
    switch (score)
    {
    case 1:
    case 2: t.setText("Oopsie! Better Luck Next Time!");
    break;
    case 3:
    case 4:t.setText("Hmmmm.. Someone's been reading a lot of trivia");
    break;
    case 5:t.setText("Who are you? A trivia wizard???");
    break;
    }
}
}

这是logcat错误

  

05-15 10:50:04.686:W / dalvikvm(12197):threadid = 1:线程退出,未捕获异常(group = 0x41f758b0)   05-15 10:50:04.696:E / AndroidRuntime(12197):致命异常:主要   05-15 10:50:04.696:E / AndroidRuntime(12197):java.lang.IndexOutOfBoundsException:索引4无效,大小为4   05-15 10:50:04.696:E / AndroidRuntime(12197):at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)   05-15 10:50:04.696:E / AndroidRuntime(12197):at java.util.ArrayList.get(ArrayList.java:308)   05-15 10:50:04.696:E / AndroidRuntime(12197):at com.example.timestableseasy.QuizActivity $ 1.onClick(QuizActivity.java:50)   05-15 10:50:04.696:E / AndroidRuntime(12197):在android.view.View.performClick(View.java:4421)   05-15 10:50:04.696:E / AndroidRuntime(12197):在android.view.View $ PerformClick.run(View.java:17903)   05-15 10:50:04.696:E / AndroidRuntime(12197):在android.os.Handler.handleCallback(Handler.java:730)   05-15 10:50:04.696:E / AndroidRuntime(12197):在android.os.Handler.dispatchMessage(Handler.java:92)   05-15 10:50:04.696:E / AndroidRuntime(12197):在android.os.Looper.loop(Looper.java:213)   05-15 10:50:04.696:E / AndroidRuntime(12197):在android.app.ActivityThread.main(ActivityThread.java:5225)   05-15 10:50:04.696:E / AndroidRuntime(12197):at java.lang.reflect.Method.invokeNative(Native Method)   05-15 10:50:04.696:E / AndroidRuntime(12197):at java.lang.reflect.Method.invoke(Method.java:525)   05-15 10:50:04.696:E / AndroidRuntime(12197):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:741)   05-15 10:50:04.696:E / AndroidRuntime(12197):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)   05-15 10:50:04.696:E / AndroidRuntime(12197):at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:1)

指数从0开始,因此具有4个元素的List将具有从0到3的索引。访问索引4超出范围:

currentQ=quesList.get(qid);

您需要确保qid< 4,或更一般地< quesList.size()

为什么在两个问题之后达到上限是因为您为每个问题增加了qid两次。

答案 1 :(得分:1)

您在setQuestionView();点击时呼叫Button两次,因此每次点击qid而不是1 Button增加2 >