我知道我在这里有点冒险,但我似乎无法理解为什么我们不能两次创建 Scanner 类的实例。我将添加一个示例以防万一。
import java.util.Scanner;
public class Nope
{
public static void main(String[] args)
{
System.out.println("What's your name?");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("Welcome " + name + "!");
scanner.close();
// Now
System.out.println("where you do live?");
Scanner sc = new Scanner(System.in);
String country = sc.nextLine();
System.out.println("That's a lovely place");
sc.close();
}
}
我收到一个运行时错误,看起来像这样
What's your name?
Kate
Welcome Kate!
Exception in thread "main" where you do live?
java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
at Nope.main(Nope.java:17)
我知道再次创建同一类的新对象并鼓励冗余是没有意义的。但我只是想,如果我知道为什么,我的头脑就会清醒,你不也这么认为吗?
机器是什么意思'java.util.NoSuchElementException:未找到行'人们说扫描仪不可克隆。
PS:我故意关闭了我的第一个扫描仪并创建了一个新对象只是为了了解这个问题。
实际上这里发生了两件不同的事情。
-
你应该创建一个Scanner
每个输入source。例如,一个Scanner
对于每个不同的输入文件,一个用于System.in
,每个不同的套接字输入流都有一个。
原因是(正如 Chrylis 指出的那样)是各种方法Scanner
提前阅读扫描仪的输入源。当角色不存在时consumed通过操作,它们不会放回到输入源中。相反,它们是由Scanner
本身,并为下一个保留Scanner
操作来使用。所以如果你有两个Scanner
尝试从同一输入源读取的实例中,一个可能会“窃取”用于另一个的输入。
这是real开设多个的原因Scanner
物体上System.in
不好。不是你提出的“冗余”论点。一点冗余从根本上来说并没有什么问题……特别是当它简化了应用程序时。但扫描仪争夺输入may导致意外的行为/错误。
-
第二个问题是当你close()
a Scanner
这也会关闭输入源。
就您而言,这意味着您要关闭System.in
。然后你正在创建第二个Scanner
阅读(现已关闭)System.in
.
当您尝试向我们Scanner
从封闭的状态中读取System.in
,这导致NoSuchElementException
.
所以如果你没有打电话close()
在第一个Scanner
,你的代码might已经有效,但这取决于您在第一个操作上进行的操作顺序Scanner
.
人们都在说Scanner
不可克隆。
他们是正确的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)