我有扫描仪的问题,我真的不知道什么是错的。我有一个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)
怎么了?
答案 0 :(得分:1)
Scanner.nextLine()
如果无法从提供的InputStream
中读取一行,则会引发NoSuchElementException
。由于您使用System.in
作为输入流,并且因为它会阻塞线程直到它可以读取请求的行,所以只剩下一个原因,这可能会导致这样的问题:流已经封闭
您在Circle
构造函数中调用Scanner.close()
,这不仅会关闭扫描程序,还会关闭使用过的输入流。这意味着,变量System.in
引用的输入流已关闭,无法再次打开。因此,如果您已经创建了一个圆圈,或者在代码中的其他位置关闭了流,那么您将获得上述异常。
要解决此问题,请为每位读者删除每次close
来电,例如Scanner
或BufferedReader
,其中System.in
为其源流。
然后你应该考虑将r
变量提取到专用类中。然后,您可以创建Scanner
一次,并在要求用户输入的任何位置使用它。如果要关闭应用程序并执行清理,可以关闭该扫描程序。