如何在 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;

扫描操作可能会阻塞等待输入。如果没有收到输入,那么扫描器对象就不必读取,这会导致抛出异常,因为它找不到需要关闭的元素。通过验证流是否包含扫描对象可以读取的任何内容,将帮助您获得此类异常。