簡體   English   中英

Android Java 中的 java.lang.IndexOutOfBoundsException

[英]java.lang.IndexOutOfBoundsException in Android Java

我正在創建一個包含游戲的訓練應用程序。 其中一個游戲是真假測驗,當一個陳述出現在屏幕上時,用戶點擊真假。

當我回答 true 或 false 時,某些語句會起作用,但經過幾次語句后,應用程序因索引超出范圍錯誤而終止。

我有一個游戲課程,還有一個陳述及其相應答案的課程。

當我運行應用程序時,在問了幾個問題后應用程序關閉並出現這些錯誤。

 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 US 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 US 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 US 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 US 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]; } }

我認為您應該以這種方式更改按鈕的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類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM