在java.util.Scanner.throwFor(未知来源)错误

时间:2012-10-13 16:00:10

标签: java

  private static int posNum() {
            Scanner scan = new Scanner(System.in);
            int input = 0;
            boolean error;

            if (scan.hasNextInt()) {
                input = scan.nextInt();
                error = input <= 0;
            } else {
    28          scan.next();
                error = true;
            }
            while (error) {
                System.out.print("Invalid input. Please reenter: ");
                if (scan.hasNextInt()) {
                    input = scan.nextInt();
                    error = input <= 0;
                } else {
                    scan.next();
                    error = true;
                }
            }
            scan.close();
            return input;

        }

所以我第二次调用此方法时返回以下错误。

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at q2.CylinderStats.posNum(CylinderStats.java:28)
    at q2.CylinderStats.main(CylinderStats.java:62)

第一个调用是rad = posNum();,运行正常,然后是height = posNum();,它不允许在输入错误之前输入值。

由于

2 个答案:

答案 0 :(得分:2)

在致电next时,您应该检查扫描仪是否有一个。

 if(scan.hasNext())
 scan.next();

根据Scanner#next

的java文档
  

如果没有更多令牌可用,则为NoSuchElementException

您可以更改以下方法

private static int posNum(Scanner scan) {
    int input = 0;
    boolean error = false;
    if (scan.hasNext()) {
        if (scan.hasNextInt()) {
            input = scan.nextInt();
            error = input <= 0;
        } else {
            scan.next();
            error = true;
        }
    }
    while (error) {
        System.out.print("Invalid input. Please reenter: ");
        if (scan.hasNextInt()) {
            input = scan.nextInt();
            error = input <= 0;
        } else {
            if (scan.hasNext())
                scan.next();
            error = true;
        }
    }
    return input;
}

然后像下面那样打电话

    Scanner scan = new Scanner(System.in);
    int i = posNum(scan);
    System.out.println(i);
    int j = posNum(scan);
    System.out.println(j);

答案 1 :(得分:2)

它运行一次并给你带来麻烦的事实意味着它无法从流中读取任何内容。

来自Java DOC:

当扫描仪关闭时,如果源实现了Closeable接口,它将关闭其输入源。

这意味着它会关闭System.in

因此,打开扫描仪将第二次防止错误。

删除scan.close();,您的程序应该可以正常工作!