Android 在另一个类中使用另一个类的数组时发生越界异常
我已经在我的应用程序中添加了一个测验活动。我使用整数数组Android 在另一个类中使用另一个类的数组时发生越界异常,android,arrays,static,indexoutofboundsexception,Android,Arrays,Static,Indexoutofboundsexception,我已经在我的应用程序中添加了一个测验活动。我使用整数数组selected\u options存储用户选择的选项。测验向用户显示每次尝试5个问题,并将其存储在数组中,然后我添加了一个解决方案活动,其中用户选择的选项中,如果答案错误,则以红色显示,否则以绿色显示。我在显示绿色时没有问题,因为我直接从数据库中调用答案并相应地高亮显示 但是,当突出显示用户选择的错误选项时,我遇到了一个问题,因为selected_options数组没有按我所希望的那样工作。另外,我得到了一个java.lang.Array
selected\u options
存储用户选择的选项。测验向用户显示每次尝试5个问题,并将其存储在数组中,然后我添加了一个解决方案活动,其中用户选择的选项中,如果答案错误,则以红色显示,否则以绿色显示。我在显示绿色时没有问题,因为我直接从数据库中调用答案并相应地高亮显示
但是,当突出显示用户选择的错误选项时,我遇到了一个问题,因为
selected_options
数组没有按我所希望的那样工作。另外,我得到了一个java.lang.ArrayIndexOutOfBoundsException:length=4;index=4
在“解决方案”活动中到达滚动视图底部时出错,活动崩溃
下面是我如何声明变量所选的\u选项
:
public static final ArrayList<questionObject> selected_questions = new ArrayList<>();
public static int[] selected_options;
public ArrayList<questionObject> result;
public ArrayList<questionObject> seen_questions;
TextView question, option1_text, option2_text, option3_text, option4_text, qCount;
ConstraintLayout[] options = new ConstraintLayout[4];
DatabaseReference databaseReference;
String currentUserID;
private Dialog loadingDialog;
private int quesNum;
private int score;
这就是我如何在onClick()方法中添加所选选项的方法:
public void onClick(View view) {
int selectedOption = 0;
switch (view.getId()) {
case R.id.option_1_tile:
selectedOption = 1;
break;
case R.id.option_2_tile:
selectedOption = 2;
break;
case R.id.option_3_tile:
selectedOption = 3;
break;
case R.id.option_4_tile:
selectedOption = 4;
break;
default:
}
selected_options[quesNum] = selectedOption;
checkAnswer(selectedOption, view);
}
这就是我在quizAdater
中尝试使用它的方式:
class questionAdapter extends BaseAdapter {
TextView question, option1_text, option2_text, option3_text, option4_text, explanation, source;
ConstraintLayout[] options = new ConstraintLayout[4];
private Context context;
private ArrayList<questionObject> questions = quizActivity.selected_questions;
private int[] optionsSelected = quizActivity.selected_options;
public questionAdapter(Context context, ArrayList<questionObject> arrayList) {
this.context = context;
this.questions = arrayList;
}
@Override
public int getCount() {
return questions.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.quiz_solutions_row, parent, false);
question = convertView.findViewById(R.id.question_text);
option1_text = convertView.findViewById(R.id.option_1_text);
option2_text = convertView.findViewById(R.id.option_2_text);
option3_text = convertView.findViewById(R.id.option_3_text);
option4_text = convertView.findViewById(R.id.option_4_text);
explanation = convertView.findViewById(R.id.explanation);
source = convertView.findViewById(R.id.source_button);
options[0] = convertView.findViewById(R.id.option_1_tile);
options[1] = convertView.findViewById(R.id.option_2_tile);
options[2] = convertView.findViewById(R.id.option_3_tile);
options[3] = convertView.findViewById(R.id.option_4_tile);
question.setText(questions.get(position).getQuestion());
option1_text.setText(questions.get(position).getOption1());
option2_text.setText(questions.get(position).getOption2());
option3_text.setText(questions.get(position).getOption3());
option4_text.setText(questions.get(position).getOption4());
explanation.setText("Explanation: " + questions.get(position).getExplanation());
source.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(context, urlActivity.class);
i.putExtra("url", questions.get(position).getSource());
i.putExtra("name", "Information Source");
context.startActivity(i);
}
});
if (optionsSelected[position] != questions.get(position).getAnswer()) {
options[position].setBackgroundTintList(ColorStateList.valueOf(Color.RED));
}
switch (questions.get(position).getAnswer()) {
case 1:
options[0].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
break;
case 2:
options[1].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
break;
case 3:
options[2].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
break;
case 4:
options[3].setBackgroundTintList(ColorStateList.valueOf(Color.GREEN));
break;
}
return convertView;
}
}
我已经检查了日志,变量quesNum
正确地从0变为4,并且selected\u options
数组也按预期工作,因此我无法调试可能导致问题的原因在将selectedOption设置为列表之前添加检查,如下所示-
if(quesNum < 4){
selected_options[quesNum] = selectedOption;
checkAnswer(selectedOption, view);
}
if(quesNum<4){
所选选项[quesNum]=所选选项;
检查答案(选择选项,查看);
}
检查何时何地增加quesNum的值。在从列表中获取索引之前,请尝试打印其值。这就是为什么会出现崩溃,因为索引值大于列表大小代码>实现的其余部分是否适合我的用例?为什么int[4]
?我每次尝试都有5个问题,所以不应该是[5]
?这样做会使最后一个问题本身的测验崩溃这样做会使最后一个问题本身的测验崩溃
哪一行?调试了吗?java.lang.ArrayIndexOutOfBoundsException:length=4;INPIRE2CONNECT.INPIRE2CONNECT.QUITY.QUIZAVITY.onClick(QUIZAVITY.java:345)上的index=4
行selected\u options[quesNum]=selectedOption
在我上面给出的onClick()
方法中,它不应该是(quesNum<5)
,因为我总共有5个问题要显示吗?根据您的崩溃日志,索引4正在崩溃。这就是为什么我要求打印quesNum的值。您将了解确切的值和问题。它只记录为0、1、2、3、4。那么可能会出现什么问题?现在检查并尝试打印所选的\u选项列表大小。如果列表大小打印为5,那么我们需要调试代码。但是如果列表大小打印为4,那么崩溃是显而易见的。2020-09-30 15:27:23.281 32701-32701/inspire2connect.inspire2connect D/size:Value:52020-09-30 15:27:44.652 32701-32701/inspire2connect.inspire2connect D/size:Value:52020-09-30 15:27:48.467 32701-32701/inspire2connect.inspire2connect D/size:Value:52020-09-30 15:2732701-32701/inspire2connect.inspire2connect D/尺寸:值:5 2020-09-30 15:27:55.101 32701-32701/inspire2connect.inspire2connect D/尺寸:值:5
options[position].setBackgroundTintList(ColorStateList.valueOf(Color.RED));
}
if(quesNum < 4){
selected_options[quesNum] = selectedOption;
checkAnswer(selectedOption, view);
}