如何在 java 中关闭扫描仪?
How do I close a scanner in java?
每当我运行下面的代码时,
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();
有关,但是当我删除它时,我收到警告说:
Resource leak: "input_scanner" is never closed"
有什么办法可以阻止错误发生并消除警告?
您应该使用 hasNextLine
api 检查您是否有数据可供扫描程序使用,您可以这样做:
String string = "";
if (input_scanner.hasNextLine()) {
string = input_scanner.nextLine();
}
嗯,首先我建议你使用 API 来理解 Java 显示的异常。
阅读此内容以获取有关 NoSuchElementException 的更多信息:
http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html
当您使用扫描器、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()
关闭您的扫描仪。
使用 try-with-resources 来保证无论是否发生任何异常,您的扫描器都会关闭。
try (Scanner input_scanner = new Scanner(System.in)) {
.
.
.
}
您可以将它与任何实现 AutoCloseable 的东西一起使用,这比需要一堆 try-catch 来处理关闭时抛出的异常要好得多。
实际上,由于您正在为 System.in 使用 Scanner,这意味着它是一个阻塞调用,它将一直保持到它收到来自用户的第一个输入。
作为一个局部变量,你真的不需要关闭扫描器,你绝对不需要 hasNextLine();
的 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;
扫描操作可能会阻塞等待输入。如果没有收到输入,那么扫描器对象就不必读取,这会导致抛出异常,因为它找不到需要关闭的元素。通过验证流是否包含扫描对象可以读取的任何内容,将帮助您获得此类异常。
每当我运行下面的代码时,
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();
有关,但是当我删除它时,我收到警告说:
Resource leak: "input_scanner" is never closed"
有什么办法可以阻止错误发生并消除警告?
您应该使用 hasNextLine
api 检查您是否有数据可供扫描程序使用,您可以这样做:
String string = "";
if (input_scanner.hasNextLine()) {
string = input_scanner.nextLine();
}
嗯,首先我建议你使用 API 来理解 Java 显示的异常。
阅读此内容以获取有关 NoSuchElementException 的更多信息:
http://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html
当您使用扫描器、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()
关闭您的扫描仪。
使用 try-with-resources 来保证无论是否发生任何异常,您的扫描器都会关闭。
try (Scanner input_scanner = new Scanner(System.in)) {
.
.
.
}
您可以将它与任何实现 AutoCloseable 的东西一起使用,这比需要一堆 try-catch 来处理关闭时抛出的异常要好得多。
实际上,由于您正在为 System.in 使用 Scanner,这意味着它是一个阻塞调用,它将一直保持到它收到来自用户的第一个输入。 作为一个局部变量,你真的不需要关闭扫描器,你绝对不需要 hasNextLine();
的 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;
扫描操作可能会阻塞等待输入。如果没有收到输入,那么扫描器对象就不必读取,这会导致抛出异常,因为它找不到需要关闭的元素。通过验证流是否包含扫描对象可以读取的任何内容,将帮助您获得此类异常。