在另一类中使用另一类的数组时出现越界异常



我在应用程序中添加了一个测试活动。我使用整数数组selected_options来存储用户选择的选项。该测试每次向用户显示5个问题,并将其存储在阵列中,然后我添加了一个"解决方案活动",如果答案错误,则在用户选择的选项中显示为红色,否则显示为绿色。当我直接调用数据库中的答案并相应地突出显示时,显示绿色没有问题。

但是,我在突出显示用户选择的错误选项时遇到了一个问题,因为selected_options数组没有按我希望的方式工作。此外,当我到达解决方案"活动"中ScrollView的底部时,我遇到了java.lang.ArrayIndexOutOfBoundsException: length=4; index=4错误,活动崩溃。

以下是我如何声明变量selected_options:

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;

以下是我如何在onCreate()函数中初始化它:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBarGradiant(this);
setContentView(R.layout.quiz_activity);
seen_questions = new ArrayList<>();
result = new ArrayList<>();
selected_options = new int[5];

question = findViewById(R.id.question_text);
qCount = findViewById(R.id.quest_num);

这就是我在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;
}
}

这是用户请求的伪代码:

  1. 在quizActivity类中声明整数数组变量selected_options

  2. onCreate()方法中的整数数组初始化为selected_options = new int[5];

  3. 将用户选择的选项(向用户显示5个问题,每个问题有4个选项(添加为选项A的1,选项2的2,依此类推

  4. quizAdapter类中,启动一个整数数组optionsSelected,并使用private int[] optionsSelected = quizActivity.selected_options;将quizActivity类中的变量数组selected_options的值存储在其中

  5. 如果用户选择了错误的选项,则在使用的解决方案活动中以红色显示他选择的选项

    if(optionsSelected[position]!=questions.get(position(.getAnswer((({

    options[position].setBackgroundTintList(ColorStateList.valueOf(Color.RED));
    }
    

我已经检查了日志,变量quesNum正确地从0变为4,selected_options阵列也按预期工作,因此我无法调试可能导致问题的原因

在设置selectedOption之前添加一个检查,如下所示-

if(quesNum < 4){
selected_options[quesNum] = selectedOption;
checkAnswer(selectedOption, view);
}

检查增加quesNum值的时间和位置。在从列表中获取索引之前,请尝试打印其值。4就是崩溃的原因,因为索引值大于列表大小。

最新更新