我有这个简单的代码:
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时,我不知道为什么总是会收到此异常。
答案 0 :(得分:4)
你应该在调用scanner.nextInt()之前添加if(Scanner.hasNext()); 你有例外,因为没有找到int。
答案 1 :(得分:4)
问题是因为你关闭了Scanner
,后者又关闭了基础InputStream
(在这种情况下是stdin)。当您尝试再次使用stdin时,Scanner
无法检索任何数据,因为stdin已关闭。
如果直接从commandlne运行,那么提供stdin访问权的正确方法是使用Console
类。控制台类提供了一个包含stdin的Reader,它具有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
或
Process p = new ProcessBuilder("java", "Example").start();
// write data to process