【问题标题】:string array randomization ArrayIndexOutOfBoundsException (EDITED)字符串数组随机化 ArrayIndexOutOfBoundsException(已编辑)
【发布时间】:2013-12-17 03:36:17
【问题描述】:

需要帮助的家伙。我在代码中添加了随机方法,现在出现此错误。


12-17 11:03:38.921: E/AndroidRuntime(306): FATAL EXCEPTION: main
12-17 11:03:38.921: E/AndroidRuntime(306): java.lang.ArrayIndexOutOfBoundsException
12-17 11:03:38.921: E/AndroidRuntime(306):  at com.example.boardrace.MainActivity.isCorrect(MainActivity.java:97)
12-17 11:03:38.921: E/AndroidRuntime(306):  at com.example.boardrace.MainActivity.checkAnswer(MainActivity.java:107)
12-17 11:03:38.921: E/AndroidRuntime(306):  at com.example.boardrace.MainActivity$1.onClick(MainActivity.java:48)
12-17 11:03:38.921: E/AndroidRuntime(306):  at android.view.View.performClick(View.java:2408)
12-17 11:03:38.921: E/AndroidRuntime(306):  at android.view.View$PerformClick.run(View.java:8816)
12-17 11:03:38.921: E/AndroidRuntime(306):  at android.os.Handler.handleCallback(Handler.java:587)
12-17 11:03:38.921: E/AndroidRuntime(306):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-17 11:03:38.921: E/AndroidRuntime(306):  at android.os.Looper.loop(Looper.java:123)
12-17 11:03:38.921: E/AndroidRuntime(306):  at android.app.ActivityThread.main(ActivityThread.java:4627)
12-17 11:03:38.921: E/AndroidRuntime(306):  at java.lang.reflect.Method.invokeNative(Native Method)
12-17 11:03:38.921: E/AndroidRuntime(306):  at java.lang.reflect.Method.invoke(Method.java:521)
12-17 11:03:38.921: E/AndroidRuntime(306):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-17 11:03:38.921: E/AndroidRuntime(306):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-17 11:03:38.921: E/AndroidRuntime(306):  at dalvik.system.NativeStart.main(Native Method)

这是我在 youtube 上看到的全部代码

public class MainActivity extends Activity {

private int currentQuestion;
private String [] questions;
private String [] answers;
private Button answerButton;
private Button questionButton;
private TextView questionView;
private TextView answerView;
private EditText answerText; 

Random random = new Random();
String randString = questions[random.nextInt(questions.length)];

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

public void init()
{questions = new String[]{"Q1?","Q2","Q3","Q4","Q5","Q6","Q7","Q8","Q9","Q10"};
 answers = new String[]{"A1","A2","A3","A4","A5","A6","A7","A8","A9","10",};
 currentQuestion = -1;
 answerButton = (Button)findViewById(R.id.AnswerButton);
 questionButton = (Button)findViewById(R.id.QuestionButton);
 questionView = (TextView) findViewById(R.id.QuestionTextView);
 answerView = (TextView) findViewById(R.id.AnswerTextView);
 answerText = (EditText) findViewById(R.id.AnswerText);

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

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

public void showQuestion()
{ currentQuestion++;
 if(currentQuestion == questions.length)
 currentQuestion =0;
questionView.setText(questions[currentQuestion]);
 answerView.setText("");
 answerText.setText("");
}

public boolean isCorrect(String answer)
{return (answer.equalsIgnoreCase(answers[currentQuestion]));
}

public void checkAnswer()
{String answer = answerText.getText().toString();
 if(isCorrect(answer))
 answerView.setText("You're right!");
 else answerView.setText("Sorry, the correct answer is "+answers[currentQuestion]);
}
}

代码是关于问题的随机化,您将输入正确的答案。

【问题讨论】:

  • MainActivity.java 中的第 97 行是什么?
  • 在你的字符串中 randString = questions[random.nextInt(questions.length)];行 random.nextInt(questions.length) 正在产生一个大于数组大小的数字 - 1. 修复它并且不会出现该错误。
  • isCorrect方法代码
  • 这个字符串 randString = questions[random.nextInt(questions.length)];在 init() 中声明问题之前声明。可以吗?
  • 请发isCorrect 方法。那是一个抛出异常。也不要在评论中发布它,edit 并更新您的问题。谢谢!

标签: android arrays string indexoutofboundsexception


【解决方案1】:

String randString = questions[random.nextInt(questions.length)];

由于randString被声明为成员变量,所以在创建类的对象时给this赋值,这个赋值依赖于questions,在init()中初始化,这个init()会被调用对象创建后。这就是你得到ArrayIndexOutOfBoundException 的原因,因为你在初始化之前尝试访问questions

流程:

  1. 对象已创建。
  2. 成员被初始化。

    2.a) randString 被赋值,但这需要question

    2.b) 所以现在,question 已被查找。

    2.c) 只能找到question 的声明。 question 不是指任何值。

    2.d) 现在 questions[random.nextInt(questions.length)] 正在尝试访问某个索引 (random int) 处的值,但 question 直到现在还没有任何东西。

    This is point where exception is raised.

Solution

如果randString 是一些初始化参数,那么做

init(){
// some code
questions = new String[]{"Q1?","Q2","Q3","Q4","Q5","Q6","Q7","Q8","Q9","Q10"};
String randString = questions[random.nextInt(questions.length)];
// some code
} 

【讨论】:

  • 解决了arrayindexoutofboundsexception,谢谢。现在 randString 变为“未使用”并带有黄色摆动下划线,并且问题不是随机的。谢谢你的回答先生@GauravGupta
  • @Jan 如果对您有帮助,请接受答案。
  • 你能帮我怎么随机吗?
  • @Jan 请详细描述问题,或者过来聊天详细讨论
  • 问题是我需要随机生成问题,同时它可以检查它的正确答案。我们可以在哪里聊天?
【解决方案2】:

试试这个:

questions[random.nextInt(questions.length-1)];

这个想法是数组位置从 0 开始。所以你的问题数组的值在 0 到 9 之间。

你传递的总长度是 10,它超出了最后一个位置,即 9。

【讨论】:

  • nextInt(max) 返回一个来自0max-1 的数字。length-1 会出错,因为它会在0-8 范围内返回
  • 没有@AmulyaKhare。它将返回 10 作为总长度。所以 10 - 1 = 9
  • questions.length = 10 => questions.length-1 = 9 => nextInt(questions.length-1) = nextInt(9) => 输出来自0-8 阅读文档:developer.android.com/reference/java/util/…
  • 我会试试这个家伙。当我进行更改时,我将只解决这个 nullpointerexception 一个新错误。
【解决方案3】:

尝试删除答案数组末尾的逗号“,”

answers = new String[]{"A1","A2","A3","A4","A5","A6","A7","A8","A9","10",};

作为

answers = new String[]{"A1","A2","A3","A4","A5","A6","A7","A8","A9","10"};

【讨论】:

  • 谢谢,但它并没有解决问题。对不起。我刚刚更新了我的代码,现在我得到了 nullpointerexception。
【解决方案4】:

问题是你初始化了currentQuestion = -1;。所以如果第一次点击回答按钮没有点击前面的问题按钮,它将执行:

public boolean isCorrect(String answer) {
     return (answer.equalsIgnoreCase(answers[-1]));
}

因此IndexOutOfBoundsException

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多