java util scanner throwforunknown源错误(cant类型输入)

时间:2015-05-28 18:18:06

标签: java java.util.scanner

我有扫描仪的问题,我真的不知道什么是错的。我有一个Circle类,我想在构造函数上为其半径进行检查循环。这是代码:

Circle(double x, double y, String color, double radius) {
    super(x, y, color); // constructor from class shape which is extended by circle
    Scanner r = new Scanner(System.in);

    while (radius <= 0)
    {
        System.out.println("radius has to be > 0.....Give radius again");
        if (r.hasNextDouble())
        {
            radius = r.nextDouble();
        }
        else
        {
            r.nextLine(); //25th line
        } 
    }
    this.radius = radius;
    r.close();
}

如果我把半径设为0,我没有机会进行输入,它给了我这样的信息:

radius has to be > 0.....Give radius again
Exception in thread "main" java.util.NoSuchElementException:No line found
at java.util.Scanner.nextLine(Unknown Source)
at pack.Circle.<init>(Circle.java:25)
at pack.Main.main(Main.java:11)

怎么了?

1 个答案:

答案 0 :(得分:1)

Scanner.nextLine()如果无法从提供的InputStream中读取一行,则会引发NoSuchElementException。由于您使用System.in作为输入流,并且因为它会阻塞线程直到它可以读取请求的行,所以只剩下一个原因,这可能会导致这样的问题:流已经封闭

您在Circle构造函数中调用Scanner.close(),这不仅会关闭扫描程序,还会关闭使用过的输入流。这意味着,变量System.in引用的输入流已关闭,无法再次打开。因此,如果您已经创建了一个圆圈,或者在代码中的其他位置关闭了流,那么您将获得上述异常。

要解决此问题,请为每位读者删除每次close来电,例如ScannerBufferedReader,其中System.in为其源流。

然后你应该考虑将r变量提取到专用类中。然后,您可以创建Scanner 一次,并在要求用户输入的任何位置使用它。如果要关闭应用程序并执行清理,可以关闭该扫描程序。