Java将扫描仪与尝试资源一起使用
作者:互联网
我有两个版本的Java代码,它们会在用户键入“ q”之前获取用户输入
版本1:
public class Test {
public static void main(String[] args) {
String input = "";
while (!input.equals("q")) {
Scanner scanner = new Scanner(System.in);
System.out.print("Input: ");
input = scanner.nextLine();
System.out.println("Input was: " + input);
}
}
}
版本2:
public class Test {
public static void main(String[] args) {
String input = "";
while (!input.equals("q")) {
try(Scanner scanner = new Scanner(System.in)){
System.out.print("Input: ");
input = scanner.nextLine();
System.out.println("Input was: " + input);
}
}
}
}
版本1可以正常工作,但版本2不能正常工作.
也就是说,第一次读取用户输入后,会产生错误
Input: 12
Input was: 12Exception in thread "main"
Input: java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at RealEstateCompany.main(RealEstateCompany.java:115)
我的猜测是,由于版本2使用try资源,因此它在使用后关闭扫描仪,这会导致错误?
提前谢谢你的帮助!
[更新]
版本3:
public class Test {
public static void main(String[] args) {
String input = "";
try(Scanner scanner = new Scanner(System.in)){
while (!input.equals("q")) {
System.out.print("Input: ");
input = scanner.nextLine();
System.out.println("Input was: " + input);
}
}
}
}
版本3可以使用.但是,为什么版本3可以正常运行,而版本2不能正常运行呢?
解决方法:
在我的评论中添加更多细节
尝试块的定义如下:
try(...) {
...
}
其中括号中的参数必须是java.lang.AutoCloseable
的实例.一个示例是类java.io.InputStream
,它也是System.in的类.
离开该块后,尝试尝试自动关闭其提供的资源.根据使用的资源,它也会关闭自己的所有子资源.
以您的示例为例,您尝试使用Scanner作为资源的try(Scanner Scanner = new Scanner(System.in)).扫描程序本身使用System.in作为资源.离开try块后(到达}时)它将尝试关闭其资源,即Scanner实例.该实例还尝试关闭其资源System.in.
一旦System.in关闭,您将无法再从控制台获得任何输入(我想至少是没有其他工作).
具体来说,在第二个示例中:
while (!input.equals("q")) {
try(Scanner scanner = new Scanner(System.in)){
...
} // <--- The block is left, scanner is closed, System.in is closed
} // <-- start a new iteration
在这里,仅经过一次迭代,System.in就关闭了.当然,您在下一个迭代中创建了一个新的Scanner,但是System.in保持关闭状态,这就是为什么在这种情况下会出现异常的原因.
您的第三个示例:
try(Scanner scanner = new Scanner(System.in)){
while (!input.equals("q")) {
...
} // <-- start a new iteration, while still in the same try block
} // <-- only after the while, your resources are closed
在这里,您正在循环使用,同时仍在尝试中.因此,没有资源会被关闭,直到您离开一段时间后再尝试.这意味着一台Scanner保持不变,而一台System.in保持不变.这使您可以继续从控制台读取内容,直到完成循环为止.
标签:try-catch,try-with-resources,java 来源: https://codeday.me/bug/20191110/2014583.html