Java:使用Scanner时始终接收NoTouchElementException
我有一个简单的代码:Java:使用Scanner时始终接收NoTouchElementException,java,exception,java.util.scanner,Java,Exception,Java.util.scanner,我有一个简单的代码: public class Example { public Example() { Scanner scanner = new Scanner(System.in); int row = scanner.nextInt(); // exception at this line scanner.close(); } public static void main(St
public class Example {
public Example() {
Scanner scanner = new Scanner(System.in);
int row = scanner.nextInt(); // exception at this line
scanner.close();
}
public static void main(String[] args) {
Example ex1 = new Example(); // this line successfully operate
Example ex2 = new Example(); // exception : no such element exception at above line
}
}
我不知道为什么在代码运行到ex2时总是收到此异常。在调用Scanner.nextInt()之前,应该添加if(Scanner.hasNext());
出现异常是因为找不到可读取的int。问题是因为您关闭了
扫描仪,而扫描仪又关闭了底层输入流(在本例中为stdin)。当您再次尝试在中使用stdin时,扫描仪
无法检索任何数据,因为stdin已关闭
如果直接从commandlne运行,那么提供对stdin的访问的正确方法是使用控制台
类。console类提供了一个环绕stdin的读取器,该读取器具有一个no-op-close方法。例如
public class Example {
public Example() {
Scanner scanner = new Scanner(System.console().reader());
// note change on above line
int row = scanner.nextInt();
scanner.close();
}
}
注意,如果您不是通过Console类访问stdin,那么您可能会给自己带来问题。如果您不是直接从命令行调用java程序,那么您将无法访问控制台。例如,以下调用将导致问题
echo 2 3 | java Example
或
这些代码甚至无法编译。请不要将“几乎”的代码发布到此站点。请只发布真实代码。@HovercraftFullOfEels对不起,我已经编辑了我的代码。我的完整代码很长,我再次手工输入到这个网站,发现了很多错误:)谢谢你的更正@Issam已经找到了您的答案。@hqt。。如果您使用谷歌-使用扫描仪读取用户输入。。在0.001秒内,你会注意到数以百万计的结果向你尖叫。可能的重复结果应该是hasnetint()
。hastnextxxx()
应该与nextXXX()
匹配。但是1+,因为你的概念是正确的。如果没有这样的整数可以读取,下一步应该尝试什么?为什么在创建另一个对象时会出现此错误?(不是第一次出现,我创建的是ex1,而是ex2)。谢谢:)当您关闭第一台扫描仪时,您也会按照扫描仪关闭方法()中的说明关闭stdin,由于这个原因,第二个将不起作用。这意味着:我们不应该像我上面的示例那样关闭扫描仪?更好的方法是使用一个扫描仪实例,并在主方法末尾关闭它。不需要有两个扫描仪。你不是指System.in吗?(否则输入的stdin必须是general)@IMustBeSomeone stdin是所有程序获得的输入流的通用名称。在java中,System.In
是表示stdin的特定对象。
Process p = new ProcessBuilder("java", "Example").start();
// write data to process