【问题标题】:Out of bounds exception while using an array of another class in another class在另一个类中使用另一个类的数组时出现越界异常
【发布时间】:2020-09-30 08:27:26
【问题描述】:

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

但是我在突出显示用户选择的错误选项时遇到了一个问题,因为 selected_options 数组没有按我想要的那样工作。此外,当我到达解决方案 Activity 中的 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个选项)为1-用于选项A,2-用于选项2等等

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

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

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

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

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

【问题讨论】:

  • selected_options = new int[4];
  • 实现的其余部分是否适合我的用例?为什么int[4]
  • 我每次尝试有 5 个问题,所以不应该是 [5] 吗?这样做会使最后一个问题本身的测验崩溃
  • doing that crashes the quiz on the last question itself 哪一行?你调试了吗?
  • java.lang.ArrayIndexOutOfBoundsException: length=4; index=4 at inspire2connect.inspire2connect.quiz.quizActivity.onClick(quizActivity.java:345) 在我上面给出的onClick() 方法中的selected_options[quesNum] = selectedOption;

标签: android arrays static indexoutofboundsexception


【解决方案1】:

在将 selectedOption 设置为如下列表之前添加检查 -

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

检查何时何地增加 quesNum 的值。在从列表中获取索引之前尝试打印它的值。是 4 这就是崩溃的原因,因为索引值大于列表大小。

【讨论】:

  • 不应该是(quesNum &lt; 5),因为我总共有 5 个问题要显示吗?
  • 根据您的崩溃日志,索引 4 正在崩溃。这就是为什么我要求打印 quesNum 的值。您将了解确切的价值和问题。
  • 它仅记录为 0、1、2、3、4。那可能是什么问题?
  • 现在检查尝试打印 selected_options 列表大小。如果列表大小打印 5,那么我们需要调试代码。但如果列表大小将打印 4,那么崩溃是显而易见的。
  • 2020-09-30 15:27:23.281 32701-32701/inspire2connect.inspire2connect D/Size: Value: 5 2020-09-30 15:27:44.652 32701-32701/inspire2connect.inspire2connect D/Size: Value: 5 2020-09-30 15:27:48.467 32701-32701/inspire2connect.inspire2connect D/Size: Value: 5 2020-09-30 15:27:52.678 32701-32701/inspire2connect.inspire2connect D/Size: Value: 5 2020-09-30 15:27:55.101 32701-32701/inspire2connect.inspire2connect D/Size: Value: 5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2015-04-29
  • 2011-04-29
  • 2022-09-27
  • 1970-01-01
  • 2013-04-23
相关资源
最近更新 更多