如何关闭循环内部的扫描仪?

时间:2018-02-18 01:45:10

标签: java

这段代码有效,但我留下了一个未关闭的扫描仪,当我尝试关闭它时,它会导致连续循环。如何关闭此扫描仪而不会导致连续循环。

这是我的代码:

    double startingAmount = 0;

    //Asks how much money customer has to spend, and will re-ask if an invalid input is put in.
    System.out.println("Please enter how much money you have to spend (enter -1 to shut down):");
     int x = 1;

     do {

     try {
         Scanner scanner = new Scanner(System.in);  
         startingAmount = scanner.nextDouble();
         x = 2;

     } catch (Exception e) {
         System.out.println(
                 "Invalid input, please enter how much money you have to spend (enter -1 to shut down):");             
     }

 } while (x == 1);  

3 个答案:

答案 0 :(得分:0)

别。在循环之前打开它。通常你会在循环后关闭它,但是当它包裹System.in时你根本不应该关闭它。

答案 1 :(得分:0)

关闭IO流(这是System.in用于键盘)总是一个好主意,以便消除潜在的资源泄漏,但在这种特殊情况下(作为控制台应用程序),您应该只关闭扫描仪(当您知道完全时,使用System.in)。在您的情况下,它将在您的简单应用程序结束时自动关闭。关闭使用 System.in 扫描程序后,您将无法在当前应用程序会话期间再次使用 System.in

do / while 循环上方创建您的扫描仪实例。在循环中完成它并不是一个好主意。

由于您的代码目前已编写,因此只有 Scanner.nextDouble()方法需要 try / catch 。尝试使用正确的例外 - 最好使用 InputMismatchException ,而不仅仅是例外

您的初始提示最好放在执行/同时循环的开头,无需双重提示。允许 catch 块仅指示无效条目。

使用执行/执行(true) while(true){} 可能会更适合您,而不是使用整数变量 x < / strong>然后代替x = 2;使用break;。使用 int 变量执行此操作的方式可以正常工作并且没有任何问题,只要它满足循环的条件并且在某些时候肯定会退出那个循环。我发现使用 while(true) break; 可以找到更简洁的东西。当然,这只是基于意见,我们希望尝试避免。

您应该在捕获代码块之后直接 ,以清除扫描程序缓冲区,因为 nextDouble() (或 nextByte() nextShort() nextInt() nextLong() nextFloat()等)不提供换行符。这将消除无效条目上的连续循环。

StackOverflow 很多示例,说明如何实现您的目标。你只需要渴望搜索它们。甚至放置一些模糊不清的内容,例如&#34; 如何在java控制台中提示用户 &#34;进入谷歌将产生约400万的结果。

答案 2 :(得分:0)

Scanner实现java.io.Closeable接口。因此,您可以使用try-with-resources构造实例化新的Scanner实例。

如果你真的需要在Scanner循环中创建do/while,你可以做类似的事情:

public static void main(String[] args) {
    double startingAmount = 0;

    //Asks how much money customer has to spend, and will re-ask if an invalid input is put in.
    System.out.println("Please enter how much money you have to spend (enter -1 to shut down):");
    int x = 1;

    do {
        try (Scanner scanner = new Scanner(System.in)) {
            startingAmount = scanner.nextDouble();
            x = 2;
        }
    } while (x == 1);
}

然而,使用try-with-resources创建扫描程序并在try块中添加循环可能是个更好的主意:

public static void main(String[] args) {
    double startingAmount = 0;

    //Asks how much money customer has to spend, and will re-ask if an invalid input is put in.
    System.out.println("Please enter how much money you have to spend (enter -1 to shut down):");
    int x = 1;

    try (Scanner scanner = new Scanner(System.in)) {
        do {
            startingAmount = scanner.nextDouble();
            x = 2;
        } while (x == 1);
    }
}