java.lang.IndexOutOfBoundsException in Android Java



我正在创建一个包含游戏的培训应用程序。其中一个游戏是真或假测验,当屏幕上出现语句时,用户单击真或假。

当我回答真或错时,某些语句有效,但在几个语句之后,应用程序因索引越界错误而终止。

我有一个游戏类,一个语句及其相应答案的类。

当我运行该应用程序时,经过几个问题后,应用程序会关闭,并且我收到这些错误。

Process: com.example.securityapp, PID: 28776
java.lang.IndexOutOfBoundsException: Index: 8, Size: 8
at java.util.ArrayList.get(ArrayList.java:437)
at 
com.example.securityapp.industry_standards_questions.checkAnswer(industry_standards_questions.java:104)
at com.example.securityapp.industry_standards_questions.access$000(industry_standards_questions.java:20)
at com.example.securityapp.industry_standards_questions$2.onClick(industry_standards_questions.java:71)

package com.example.securityapp;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;
import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewAnimator;
import org.w3c.dom.Text;
import java.util.ArrayList;
import java.util.Collections;
public class industry_standards_questions extends AppCompatActivity {
TextView stmnt;
ImageView image_true, image_false;
Button points;
Statements tfStatements;
int statementsLength;
ArrayList<Item> statementList;
int currentStatement = 0;
int grade = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_industry_standards_questions);
stmnt = (TextView) findViewById(R.id.statement_TV);
image_true = (ImageView) findViewById(R.id.trueImage);
image_false = (ImageView) findViewById(R.id.falseImage);
tfStatements = new Statements();
statementsLength = tfStatements.tfStatements.length;
statementList = new ArrayList<>();
points = (Button) findViewById(R.id.final_score);
for(int i = 0; i < statementsLength; i++){
statementList.add(new Item(tfStatements.getStatment(i), tfStatements.getAnswer(i)));
}
Collections.shuffle(statementList);
setStmnt(currentStatement);
points.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
score();
}
});
image_true.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentStatement++;
if(checkAnswer(currentStatement)){
grade++;
if(currentStatement < statementsLength){
setStmnt(currentStatement);
}
}
}
});
image_false.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentStatement++;
if(!checkAnswer(currentStatement)){
grade++;
if(currentStatement < statementsLength){
setStmnt(currentStatement);
}
}
}
});
}
// show Statement
private void setStmnt(int number){
stmnt.setText(statementList.get(number).getStatement());
}
//check is answer is right
private boolean checkAnswer(int number){
String answer = statementList.get(number).getAnswer();
return answer.equals("true");
}
public void score(){
Toast.makeText(this, "You scored " + grade + " points!", Toast.LENGTH_LONG).show();
grade = 0;
}
}

package com.example.securityapp;
public class Statements {
public String tfStatements [] = {
"10% of U.S. companies use the Cybersecurity Framework",
"Prevent is an element within the framework",
"Respond is an element within the framework",
"Access control is a future priority",
"Risk Assessment is a current priority",
"Asset management is a current priority",
"The framework can be customised",
"By 2020, an estimated 70% of U.S. companies will use the framework"
};
public String tfAnswers [] = {
"false",
"false",
"true",
"false",
"true",
"true",
"true",
"false"
};
public String getStatment (int number) {
return tfStatements[number];
}
public String getAnswer (int number) {
return tfAnswers[number];
}
}


这是语句类

package com.example.securityapp;
public class Statements {
public String tfStatements [] = {
"10% of U.S. companies use the Cybersecurity Framework",
"Prevent is an element within the framework",
"Respond is an element within the framework",
"Access control is a future priority",
"Risk Assessment is a current priority",
"Asset management is a current priority",
"The framework can be customised",
"By 2020, an estimated 70% of U.S. companies will use the framework"
};
public String tfAnswers [] = {
"false",
"false",
"true",
"false",
"true",
"true",
"true",
"false"
};
public String getStatment (int number) {
return tfStatements[number];
}
public String getAnswer (int number) {
return tfAnswers[number];
}
}

我认为您应该通过以下方式更改按钮的onClick

image_true.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(checkAnswer(currentStatement)){
grade++;
if(currentStatement < statementsLength -1)
setStmnt(currentStatement);
}
currentStatement++;
}
});
image_false.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!checkAnswer(currentStatement)){
grade++;
if(currentStatement < statementsLength -1)
setStmnt(currentStatement);
}
currentStatement++;
}
});

使用您的代码,当用户回答第 8 个问题时,您会在位置 8 处检查答案,但 tfAnswers 的最后一个元素的索引为 7。

但是,在您的代码中有一些我不明白的地方:这一行:

String answer = statementList.get(number).getAnswer();

并且,准确地说,在String上调用getAnswer,而不传递参数,而方法定义为

public String getAnswer (int number) {
return tfAnswers[number];
}

所以使用int参数,所以我以这种方式调用它:

String answer = tfStatements.getAnswer(number);

但我认为错误还没有到此结束,我会以这种方式使用您的方法:

private boolean checkAnswer(int number, String givenAnswer){
String answer = tfStatements.getAnswer(number);
return answer.equals(givenAnswer);
}

并以这种方式调用:

image_true.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(checkAnswer(currentStatement, "true"))
grade++;
currentStatement++;
if(currentStatement < statementsLength -1)
setStmnt(currentStatement)
}
});
image_false.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(checkAnswer(currentStatement, "false"))
grade++;
currentStatement++;
if(currentStatement < statementsLength -1)
setStmnt(currentStatement);
}
});

顺便说一下,考虑使用它代替您的tfAnswers

public boolean tfAnswers [] = {
false,
false,
true,
false,
true,
true,
true,
false
};

并使用staticStatements类。

最新更新