Java IOException InfiniteLoop

时间:2014-10-07 08:52:08

标签: java

我有这个方法,我想检查用户输入。如果它是一个数字但是大于9且lees比1或Char / String我想抛出异常。使用它可以使用的数字,但是当我想检查char / Strings时,它会进入无限循环。

private static Scanner in = new Scanner(System.in);

public static int getPlayerPositionInput(String message)     {
    System.out.println(message);
    while(true) {
        System.out.println("1");
        try {
            if(in.hasNextInt()){
                int i = in.nextInt();
                if(i<1 || i>9 ) throw new IOException();
                return i;
            } else throw new IOException();
        } catch(Exception e) {
            System.out.println("The number has to be greater than 0 and less than 10");
        }
    }
}

我在考虑使用ASCII表,这是个好主意吗?

3 个答案:

答案 0 :(得分:2)

如果您输入String,则if(in.hasNextInt()){将始终为false,因此无法输入。

尝试使用hasNextnextLine

答案 1 :(得分:1)

问题是,在您提交非数字字符串后,hasNextInt()会返回false。但是scince你不会丢弃错误的输入,它会在下次调用时返回false

试试这个:

    while (true) {
        System.out.println("1");
        try {
            if (in.hasNext()) {
                if (in.hasNextInt()) {
                    int i = in.nextInt();
                    if (i < 1 || i > 9) {
                        throw new IOException();
                    }
                    return;
                } else {
                    in.next(); // discard the input
                    throw new IOException();
                }
            }
        } catch (IOException e) {
            System.out.println("The number has to be greater than 0 and less than 10");
        }
    }

答案 2 :(得分:0)

因为你正在捕捉异常并进入下一个循环。

异常是IOException的超类。请阅读以下文档。

http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html

您的异常捕获逻辑需要重构。