java - 尝试从 ArrayList 获取字符串时出现 IndexOutOfBoundsException
问题描述
所以我正在尝试创建一个小型刽子手迷你游戏。不幸的是,我一直收到同样的错误。我尝试过两次重做游戏,但似乎仍然无法正确完成。我确定这只是一些逻辑错误或其他东西。
我对 Java 还是比较陌生,所以任何帮助将不胜感激。
我已将程序分为三个类。一个用于 Hangman 对象,一个用于包含所述对象的数组,一个用于使用这些对象的数组。以下三个部分是游戏的片段。
第一类:刽子手
package hangman2;
import java.util.*;
import java.io.*;
public class Hangman {
private ArrayList<String> words = new ArrayList<>();
private int diff;
public Hangman(String fileName, int difficulty) {
diff = difficulty;
//easy = 0; medium = 1; hard = 2
try {
Scanner scanFile = new Scanner(new File(fileName));
while(scanFile.hasNext()) {
String line = scanFile.nextLine();
Scanner scanLine = new Scanner(line);
String tempWord = scanLine.next();
words.add(tempWord);
}
}
catch (FileNotFoundException e) {
System.out.println("File not found\n" + e);
}
}
//Gets
public ArrayList<String> getWords() { return words; }
public int getDifficulty() { return diff; }
//Sets
public void addWord(String word) { words.add(word); }
}
第 2 类:HangmanArray
package hangman2;
import java.util.ArrayList;
import javax.swing.JOptionPane;
public class HangmanArray {
private Hangman easyHangman;
private Hangman mediumHangman;
private Hangman hardHangman;
public HangmanArray() {
easyHangman = new Hangman("easy.txt", 0);
mediumHangman = new Hangman("medium.txt", 1);
hardHangman = new Hangman("hard.txt", 2);
}
public String getRandomWord() {
Hangman workingHangman = chooseDifficulty();
int max = workingHangman.getWords().size();
int randIndex = (int) (Math.random() * max);
return workingHangman.getWords().get(randIndex);
}
private Hangman chooseDifficulty() {
int chosenDifficulty = Integer.parseInt(JOptionPane.showInputDialog("Choose difficulty level\n"
+ "1: Novice\n2: Intermediate\n3: Expert"));
Hangman retHangman = null;
switch(chosenDifficulty) {
case 1: retHangman = easyHangman; break;
case 2: retHangman = mediumHangman; break;
case 3: retHangman = mediumHangman; break;
}
if (retHangman == null) {
System.out.println("Chosen difficulty not within range of [1;3]\nexiting");
System.exit(0);
}
return retHangman;
}
}
第 3 类:HangmanUI
package hangman2;
public class HangmanUI {
public static void main(String[] args) {
HangmanArray hangmanArray = new HangmanArray();
System.out.println(hangmanArray.getRandomWord());
}
}
The error appears to be coming from line 25 of HangmanArray when difficulty 2 or 3 is selected:
return workingHangman.getWords().get(randIndex);
任何帮助表示赞赏。
解决方案
您应该检查是否max
为 0,如果是,则返回null
或空字符串,然后处理这种特殊情况。
我使用Random.nextInt()而不是int randIndex = (int) (Math.random() * max);
返回一个伪随机、均匀分布的 int 值,介于 0(包括)和指定值(不包括)之间,取自该随机数生成器的序列。nextInt 的一般约定是伪随机生成并返回指定范围内的一个 int 值。所有绑定的可能 int 值都以(大约)相等的概率产生
请记住,最后一个元素的索引是size()-1
public String getRandomWord() {
Hangman workingHangman = chooseDifficulty();
int max = workingHangman.getWords().size();
if (max == 0) {
return "";
}
int randIndex = new Random().nextInt(max); // returns an integer between 0 and max-1
return workingHangman.getWords().get(randIndex);
}
您还应该使用try-with-resources来确保您正在使用的资源在您完成后关闭。
public Hangman(String fileName, int difficulty) {
diff = difficulty;
//easy = 0; medium = 1; hard = 2
try (Scanner scanFile = new Scanner(new File(fileName))) {
while(scanFile.hasNext()) {
String line = scanFile.nextLine();
Scanner scanLine = new Scanner(line);
String tempWord = scanLine.next();
words.add(tempWord);
}
}
catch (FileNotFoundException e) {
System.out.println("File not found\n" + e);
}
}
最后,我建议使用调试器来了解您在每个 Hangman 中添加了什么。
推荐阅读
- php - 调用成员函数 wp_rewrite_rules()
- bash - How to compare filenames in bash
- c - 嵌套在 for 循环中的 fprintf 不写入第一个元素
- jquery - JSON Parse error when posting to MEAN API
- ruby - 为什么我的除法运算符一直返回零?
- esp8266 - .lua are deleted when trying to copy nodemcu from one ESP8266 to another
- python - 循环 .csv 文件并删除任何非 ascii 字符串
- java - 如何为用户输入的次数迭代for循环Java
- javascript - ConstraintError:对象存储中已存在密钥
- python-3.x - 如何保存为 PNG 到 tkinter 的图像(企鹅)