Java IndexOutOfBounds异常

时间:2017-06-30 09:34:33

标签: java exception

有谁能发现我在这里做错了什么? (评论是为了向您展示代码的作用。):

/* -- 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(在此处未显示的单独类中)。

2 个答案:

答案 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))