如何在java中关闭扫描仪?

如何在java中关闭扫描仪?,java,java.util.scanner,Java,Java.util.scanner,当我运行以下代码时 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; } 我得到这个错误: E

当我运行以下代码时

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()有关但当我删除它时,会收到警告,提示:

资源泄漏:“输入\ U扫描仪”从未关闭


我是否可以阻止错误的发生并消除警告?

您应该使用
hasNextLine
api检查是否有数据用于扫描仪,您可以这样做:

String string = "";
if (input_scanner.hasNextLine()) {
    string = input_scanner.nextLine();
}

首先,我建议您使用API来理解Java向您展示的异常

有关NoTouchElementException的更多信息,请阅读此内容:

当您使用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\u scanner.hasNextLine())

您的错误在于键盘输入。请阅读以下内容以了解您在该部分是否做得很好:


PS:建议您在使用完扫描仪后,使用
input\u scanner.close()
关闭扫描仪。

使用try with resources确保扫描仪关闭,无论是否出现任何异常

try (Scanner input_scanner = new Scanner(System.in)) {
   .
   .
   .
}

您可以将其用于实现AutoCloseable的任何东西,这比关闭时抛出的异常需要一堆try-catch要好得多。

实际上,因为您使用的是System.in的Scanner,这意味着它是一个阻塞调用,将一直保持到收到用户的第一个输入为止。 作为一个局部变量,您实际上不需要关闭扫描器,也不需要hasNextLine()的while循环


扫描操作可能会阻止等待输入。如果未收到任何输入,则扫描对象不必读取,这会引发异常,因为它找不到需要关闭的元素。通过验证流是否包含扫描对象可以读取的任何内容,将帮助您获得此类异常操作。

如果您确实需要输入,那么您应该使用while循环。现在它将检查您是否有任何数据要使用,如果没有,那么它将返回一个空字符串。我认为您无法将多个扫描仪与
System.in
可靠地结合使用。如果您关闭它,那么您将关闭
系统。
…如果您没有,那么第二个扫描仪将关闭u create可能不会从第一个停止的位置开始(因为第一个可能缓冲了一些行)
Closeable
应该是
AutoCloseable
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;