Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在另一个类中使用另一个类的数组时发生越界异常_Android_Arrays_Static_Indexoutofboundsexception - Fatal编程技术网

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);
}