2015-04-25 51 views
3

当过我运行下面的代码,如何在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"

是否有反正我可以阻止错误发生并摆脱警告?

+1

我不认为你可以使用'System.in'多个扫描仪可靠。如果你关闭它,那么你关闭'System.in' ...如果你不这样做,那么你创建的第二个扫描器可能不会从第一个扫描器离开的位置开始(因为第一个扫描器可能已经缓冲了一些行) – immibis

回答

3

你应该检查是否有数据要使用hasNextLine API进行扫描消耗,你可以做这样的:

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

if你真的需要输入,那么你应该使用while循环。现在它会检查你是否有任何数据要消耗,如果没有,那么它将返回一个空字符串。 – SMA

8

首先,我建议你使用的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()关闭扫描仪。

2

使用try-with-resources保证您的扫描仪关闭,无论是否有任何异常发生。

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

可以与任何实现AutoCloseable使用,这是不是需要一堆的try-catch的关闭时抛出的异常要好得多。

+0

'Closeable'应该是'AutoCloseable' – tomse

1

实际上,由于您正在使用Scanner for System.in,这意味着它是一个阻塞呼叫,它将一直保持到接收到用户的第一个输入为止。 作为一个局部变量,你并不需要关闭扫描器,并且你肯定不需要whileNext循环来处理hasNextLine();

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; 
1

扫描操作可能会阻止等待输入。如果没有接收到输入,那么扫描器对象不必读取哪个引发Exception,因为它没有找到需要关闭的元素。通过验证流是否包含可以通过扫描对象读取的内容,可以帮助您获取这种异常。