【问题标题】:java.lang.IndexOutOfBoundsException in Android JavaAndroid Java 中的 java.lang.IndexOutOfBoundsException
【发布时间】:2020-02-03 15:31:52
【问题描述】:

我正在创建一个包含游戏的培训应用程序。其中一个游戏是真假测验,当屏幕上出现一个陈述时,用户点击真假。

当我回答 true 或 false 时,一些语句有效,但在几个语句之后,应用程序因 Index out of bounds 错误而终止。

我有一个游戏类,还有一个陈述类和相应的答案。

当我运行应用程序时,在几个问题后应用程序关闭并且我收到这些错误。

 Process: com.example.securityapp, PID: 28776
    java.lang.IndexOutOfBoundsException: Index: 8, Size: 8
        at java.util.ArrayList.get(ArrayList.java:437)
        at 

com.example.securityapp.industry_standards_questions.checkAnswer(industry_standards_questions.java:104)
        at com.example.securityapp.industry_standards_questions.access$000(industry_standards_questions.java:20)
        at com.example.securityapp.industry_standards_questions$2.onClick(industry_standards_questions.java:71)

package com.example.securityapp;

import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;

import android.media.Image;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewAnimator;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.Collections;

public class industry_standards_questions extends AppCompatActivity {

    TextView stmnt;
    ImageView image_true, image_false;
    Button points;

    Statements tfStatements;
    int statementsLength;

    ArrayList<Item> statementList;
    int currentStatement = 0;
    int grade = 0;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_industry_standards_questions);

        stmnt = (TextView) findViewById(R.id.statement_TV);

        image_true = (ImageView) findViewById(R.id.trueImage);
        image_false = (ImageView) findViewById(R.id.falseImage);

        tfStatements = new Statements();
        statementsLength = tfStatements.tfStatements.length;

        statementList = new ArrayList<>();

        points = (Button) findViewById(R.id.final_score);

        for(int i = 0; i < statementsLength; i++){
            statementList.add(new Item(tfStatements.getStatment(i), tfStatements.getAnswer(i)));
        }

        Collections.shuffle(statementList);

        setStmnt(currentStatement);

        points.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                score();
            }
        });

        image_true.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                currentStatement++;
                if(checkAnswer(currentStatement)){
                    grade++;
                    if(currentStatement < statementsLength){
                        setStmnt(currentStatement);
                    }
                }
            }
        });

        image_false.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                currentStatement++;
                if(!checkAnswer(currentStatement)){
                    grade++;
                    if(currentStatement < statementsLength){
                        setStmnt(currentStatement);

                    }
                }

            }
        });

    }

    // show Statement
    private void setStmnt(int number){
        stmnt.setText(statementList.get(number).getStatement());
    }

    //check is answer is right
    private boolean checkAnswer(int number){
        String answer = statementList.get(number).getAnswer();
        return answer.equals("true");
    }

    public void score(){
     Toast.makeText(this, "You scored " + grade + " points!", Toast.LENGTH_LONG).show();
     grade = 0;
 }

}

package com.example.securityapp;

public class Statements {

    public String tfStatements [] = {

            "10% of U.S. companies use the Cybersecurity Framework",
            "Prevent is an element within the framework",
            "Respond is an element within the framework",
            "Access control is a future priority",
            "Risk Assessment is a current priority",
            "Asset management is a current priority",
            "The framework can be customised",
            "By 2020, an estimated 70% of U.S. companies will use the framework"
    };

    public String tfAnswers [] = {
            "false",
            "false",
            "true",
            "false",
            "true",
            "true",
            "true",
            "false"

    };

    public String getStatment (int number) {
        return tfStatements[number];
    }

    public String getAnswer (int number) {
        return tfAnswers[number];
    }



}

这是语句类

package com.example.securityapp;

public class Statements {

    public String tfStatements [] = {

            "10% of U.S. companies use the Cybersecurity Framework",
            "Prevent is an element within the framework",
            "Respond is an element within the framework",
            "Access control is a future priority",
            "Risk Assessment is a current priority",
            "Asset management is a current priority",
            "The framework can be customised",
            "By 2020, an estimated 70% of U.S. companies will use the framework"
    };

    public String tfAnswers [] = {
            "false",
            "false",
            "true",
            "false",
            "true",
            "true",
            "true",
            "false"

    };

    public String getStatment (int number) {
        return tfStatements[number];
    }

    public String getAnswer (int number) {
        return tfAnswers[number];
    }



}

【问题讨论】:

  • 你有 8 条语句...
  • @LucaMurra 当然是。他有 8 个编号为 0-7 的语句,他正在尝试访问不存在的 #8。

标签: java android indexoutofboundsexception


【解决方案1】:

我认为你应该改变按钮的onClick,这样:

image_true.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(checkAnswer(currentStatement)){
                    grade++;
                    if(currentStatement < statementsLength -1)
                        setStmnt(currentStatement);
                }
                currentStatement++;
            }
        });

image_false.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!checkAnswer(currentStatement)){
                    grade++;
                    if(currentStatement < statementsLength -1)
                        setStmnt(currentStatement);
                }
                currentStatement++;
            }
        });

使用您的代码,当用户回答第 8 个问题时,您检查位置 8 的答案,但您的 tfAnswers 的最后一个元素的索引为 7。

但是,您的代码中有一些我不明白的地方:这一行:

String answer = statementList.get(number).getAnswer();

准确地说,在 String 上调用 getAnswer,不传递参数,而方法定义是

public String getAnswer (int number) {
    return tfAnswers[number];
}

所以带有int 参数,所以我会这样称呼它:

String answer = tfStatements.getAnswer(number);

但我认为错误还没有完成,我会以这种方式使用你的方法:

private boolean checkAnswer(int number, String givenAnswer){
    String answer = tfStatements.getAnswer(number);
    return answer.equals(givenAnswer);
}

并以这种方式调用:

image_true.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(checkAnswer(currentStatement, "true"))
                    grade++;
                currentStatement++;
                if(currentStatement < statementsLength -1)
                    setStmnt(currentStatement)
            }
        });

image_false.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(checkAnswer(currentStatement, "false"))
                    grade++;
                currentStatement++;
                if(currentStatement < statementsLength -1)
                    setStmnt(currentStatement);
            }
        });

顺便说一句,考虑用这个代替你的tfAnswers

public boolean tfAnswers [] = {
            false,
            false,
            true,
            false,
            true,
            true,
            true,
            false

    };

并使用 static Statements 类。

【讨论】:

  • 我将 currentStatement++ 行移至您所说的位置,但仍然遇到同样的问题。我被告知问题出在这一行` String answer = statementList.get(number).getAnswer(); `
  • 当询问以“10% 的美国公司......”开头的陈述和“风险管理”的陈述时,它似乎被打破了
  • 看看我的编辑,如果您还有其他问题要解决,请写在这里
  • 所以我玩了一个游戏,除了一个问题,它现在似乎可以工作了。我需要双击我的按钮才能显示下一条语句,单击 8 次后,游戏停止并显示分数。有没有办法让图像视图只需要单击一个按钮
  • 是的,看看我的 kast 编辑,之前的回答有点错误
猜你喜欢
  • 2020-03-29
  • 2023-03-28
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2012-10-23
  • 2012-05-09
  • 2016-04-02
  • 2014-01-20
相关资源
最近更新 更多