如何解决在另一个类中使用另一个类的数组时越界异常
我在我的应用中添加了一个测验活动。我使用整数数组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,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;
}
}
这是用户要求的伪代码:
-
在quizActivity类中声明整数数组变量
selected_options
-
在
onCreate()
方法中将整数数组初始化为selected_options = new int[5];
-
添加用户选择的选项(向用户显示5个问题,每个问题有4个选项),其中1个代表选项A,2个代表选项2,依此类推
-
在
quizAdapter
类中,启动一个整数数组optionsSelected
,并使用selected_options
将quizActivity类中变量数组private int[] optionsSelected = quizActivity.selected_options;
的值存储在其中。 / p> -
如果用户选择了错误的选项,请在解决方案“活动”中使用红色显示他选择的选项
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发生崩溃的原因,因为索引值大于列表大小。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。