有谁能发现我在这里做错了什么? (评论是为了向您展示代码的作用。):
/* -- GETS A WORD FROM A TEXT FILE -- */
public String getWord() throws IOException {
String line;
try {
InputStream fis = new FileInputStream("HangmanGame\\src\\words.txt");
InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr); ) {
while ((line = br.readLine()) != null) {
return line;
}
}
return line;
}
}
/* -- CREATES ARRAY LIST -- */
ArrayList<Character> chars = new ArrayList<Character>();
for (int i = 0; i < getWord().length(); i++) {
char j = getWord().charAt(i);
chars.add(j);
}
/* -- USER INPUT PROCESSING -- */
while(!chars.isEmpty()) {
char choice = scan.next(".").charAt(0);
// if(new String(chars).contains(String.valueOf(choice))){
if(chars.contains(choice)) {
System.out.println("You guessed right!");
chars.remove(choice);
} else {
System.out.println("You guessed wrong");
FailBuilder failed = new FailBuilder();
failed.hangmanBuilder(1);
}
}
前两个代码块按预期工作,但是在“用户输入处理”期间,只要用户输入一个字符,就会抛出IndexOutOfBounds
异常。该代码用于从用户获取一个字符,并检查它是否在数组列表中(如果是,它会被删除,如果不是,则构建hangman(在此处未显示的单独类中)。
答案 0 :(得分:2)
列表有几种remove()
方法。
您想要从列表中删除一个字符(通过调用list.remove(Object o)
),但实际上是在调用list.remove(int index);
(因为char被Widening Primitive Conversion转换为int)。
示例:
List<Character> list = new ArrayList<>();
list.add('a');
list.add('b');
list.add('c');
char choice = 'a';
list.remove(choice);
输出:
线程中的异常&#34; main&#34; java.lang.IndexOutOfBoundsException:索引:97,大小:3 at java.util.ArrayList.rangeCheck(ArrayList.java:653) at java.util.ArrayList.remove(ArrayList.java:492) 在com.denodev.stackoverflow.Main.main(Main.java:22)
正如您所看到的,choice
被视为一个int,它接受字符的ascii值&#39; a&#39; (97)。因此IndexOutOfBoundsException
通过显式转换,它可以工作:
list.remove((Character)choice);
答案 1 :(得分:1)
您指定要删除的字符而不是其位置
使用chars.remove(chars.indexOf(choice))
。