编程语言
首页 > 编程语言> > 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(...) {
   ...
}

其中括号中的参数必须是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