Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用Scanner时始终接收NoTouchElementException_Java_Exception_Java.util.scanner - Fatal编程技术网

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