这段代码有效,但我留下了一个未关闭的扫描仪,当我尝试关闭它时,它会导致连续循环。如何关闭此扫描仪而不会导致连续循环。
这是我的代码:
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);
答案 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);
}
}