java资源扫描_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(...) {

...

}

离开该块后,尝试尝试自动关闭其提供的资源.根据使用的资源,它也会关闭自己的所有子资源.

以您的示例为例,您尝试使用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)){

...

} //

} //

在这里,仅经过一次迭代,System.in就关闭了.当然,您在下一个迭代中创建了一个新的Scanner,但是System.in保持关闭状态,这就是为什么在这种情况下会出现异常的原因.

您的第三个示例:

try(Scanner scanner = new Scanner(System.in)){

while (!input.equals("q")) {

...

} //

} //

在这里,您正在循环使用,同时仍在尝试中.因此,没有资源会被关闭,直到您离开一段时间后再尝试.这意味着一台Scanner保持不变,而一台System.in保持不变.这使您可以继续从控制台读取内容,直到完成循环为止.

标签:try-catch,try-with-resources,java

来源: https://codeday.me/bug/20191110/2014583.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值