修复数组超出索引错误

时间:2017-06-07 01:24:32

标签: android

我正在通过The big nerd ranch的Android编程第3版本书自己工作。在第2章中,向应用添加上一个按钮是一项挑战。我添加了上一个按钮,只要我不尝试先前的第一个问题,它就可以正常工作。我不知道如何循环按钮,所以每当我在第一个问题之前,它默认为最后一个问题。下一个按钮会循环显示所有问题,但前一个按钮不会。我只是学习Android环境,所以我相信这是一个简单的问题。如何修复当前错误?

    mNextButton = (Button) findViewById(R.id.next_button);
    mNextButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
            updateQuestion();

            }
        });


    mPreviousButton = (Button) findViewById(R.id.previous_button);
    mPreviousButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
            updatePrevQuestion();

        }
    });

    updateQuestion();
    updatePrevQuestion();

}

private void updatePrevQuestion(){
    int question = mQuestionBank[mCurrentIndex].getTextResId();
    mQuestionTexView.setText(question);
}

private void updateQuestion(){
    int question = mQuestionBank[mCurrentIndex].getTextResId();
    mQuestionTexView.setText(question);
}

这是我得到的错误

6-06 19:18:09.158 14727-14727/com.example.dany_user.geo_quiz E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.example.dany_user.geo_quiz, PID: 14727

java.lang.ArrayIndexOutOfBoundsException: length=6; index=-1

at com.example.dany_user.geo_quiz.QuizActivity.updatePrevQuestion(QuizActivity.java:98)
                                                                                at com.example.dany_user.geo_quiz.QuizActivity.access$400(QuizActivity.java:11)
                                                                                at com.example.dany_user.geo_quiz.QuizActivity$5.onClick(QuizActivity.java:87)
                                                                                at android.view.View.performClick(View.java:6205)
                                                                                at android.widget.TextView.performClick(TextView.java:11103)
                                                                                at android.view.View$PerformClick.run(View.java:23653)
                                                                                at android.os.Handler.handleCallback(Handler.java:751)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:154)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:6682)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

1 个答案:

答案 0 :(得分:2)

问题是(-1 % n)对于Java中的任何-1都是n。为了确保您回绕到数组的末尾,您可以使用:

mCurrentIndex = (mCurrentIndex + mQuestionBank.length - 1) % mQuestionBank.length;

如果mCurrentIndex已经在范围内,那将导致mCurrentIndex始终在范围内。

如果你不想回头(并且我建议对称地对待"以前""下一个"按钮),那么你可以做一个或两者兼而有之:

  • 如果mCurrentIndex处于极值
  • ,则在事件处理程序中不执行任何操作
  • 如果SELECT * FROM Tweet WHERE text = ANY (SELECT max(length(text)), min(length(text)), avg(length(text)) FROM Tweet ) 处于极值,则禁用相关按钮,因此无法触发事件处理程序。