我什么时候运行以下代码,
private static String input(String Message){
Scanner input_scanner = new Scanner(System.in);
System.out.print("\n" + Message);
String string = input_scanner.nextLine();
input_scanner.close();
return string;
}
我收到此错误:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at main.learn.input(learn.java:25)
at main.learn.main(learn.java:13)
我发现这与行input_scanner.close();
有关,但当我删除它时,我收到警告说:
资源泄漏:" input_scanner"从未关闭"
无论如何,我可以阻止错误发生并摆脱警告吗?
答案 0 :(得分:10)
好吧,首先我建议您使用API来了解Java向您展示的异常。
阅读本文以获取有关NoSuchElementException的更多信息:
http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html
当您使用scanner,stringTokenizer,迭代器......您必须在尝试阅读之前验证是否有更多要阅读的元素。如果你不这样做,你可以得到那种类型的例外。
private static String input(String Message){
Scanner input_scanner = new Scanner(System.in);
System.out.print("\n" + Message);
if (input_scanner.hasNextLine()){
String string = input_scanner.nextLine();
}
input_scanner.close();
return string;
如果您想阅读多行,请使用while (input_scanner.hasNextLine())
你的错误是关于键盘输入。阅读本文以了解您是否做得很好: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextLine%28%29
PS:建议您在完成扫描后使用input_scanner.close()
关闭扫描仪。
答案 1 :(得分:3)
您应该检查是否有使用hasNextLine
api为扫描仪使用的数据,您可以这样做:
String string = "";
if (input_scanner.hasNextLine()) {
string = input_scanner.nextLine();
}
答案 2 :(得分:2)
使用try-with-resources保证扫描仪关闭,无论是否发生异常。
try (Scanner input_scanner = new Scanner(System.in)) {
.
.
.
}
你可以将它用于任何实现AutoCloseable的东西,并且比关闭时抛出异常需要一堆try-catch要好得多。
答案 3 :(得分:1)
实际上,由于您使用的是Scanner for System.in,这意味着它是一个阻塞调用,直到它收到用户的第一个输入为止。 作为一个局部变量,你真的不需要关闭扫描仪,你肯定不需要forNextLine()的while循环;
private static String input(String Message){
Scanner input_scanner = new Scanner(System.in);
System.out.print("\n" + Message);
String string = input_scanner.nextLine();
return string;
答案 4 :(得分:1)
扫描操作可能会阻止等待输入。如果没有接收到输入,那么scanner对象不必读取哪个使得抛出异常,因为它没有找到需要关闭的元素。通过验证流是否包含扫描对象可以读取的任何内容将帮助您获得此类异常。