捕获异常后,如何继续执行Java程序?
我制作了一个程序,要求用户输入一个数字,它将返回该数字除以生成的随机数。但是,如果用户输入类似' a'的字母,则会捕获异常。
如何使程序继续执行而不是在捕获异常后终止?
do{ //Begin of loop
try{ //Try this code
System.out.println("Enter a number");
double i = read.nextDouble(); //Reads user input
double rn = r.nextInt(10); //Generates random number rn
System.out.println(i + " divided by random number " + rn + " is " + (i/rn));
}catch(InputMismatchException type_error){ //Catches error if there is a type mismatch
//Example error: if user enters a letter instead of a double
System.out.println("Error. You cannot divide a letter by a number!");
break; //break stops the execution of the program
}
//using a continue statement here does not work
}while(true); //Loop forever
答案 0 :(得分:2)
继续获得帮助!如果使用Scanner类输入数字,则会出现无限循环写入"错误。你不能用一个数字来划分一个字母!"到输出。
您的代码等待一个双号,但收到了一封信。此事件触发异常,代码显示错误消息。但是这封信将保留在扫描仪中,因此nextInt命令会尝试在下一次迭代中加载相同的字母,而无需等待您输入。
在catch块中,您必须使用read.next()命令清空扫描仪。
Scanner read = new Scanner(System.in);
Random r = new Random();
do { //Begin of loop
try { //Try this code
System.out.println("Enter a number");
double i = read.nextDouble(); //Reads user input
double rn = r.nextInt(10); //Generates random number rn
System.out.println(i + " divided by random number " + rn + " is " + (i / rn));
} catch (InputMismatchException type_error) { //Catches error if there is a type mismatch
//Example error: if user enters a letter instead of a double
System.out.println("Error. You cannot divide a letter by a number!");
// Empty the scanner before the next iteration:
read.next();
}
//using a continue statement here does not work
} while (true); //Loop forever
答案 1 :(得分:1)
continue
语句将重新启动循环(与break
语句相反,后者终止循环)。
因此,如果您将break;
替换为continue;
,则会在Exception
被捕获后继续循环播放(假设没有其他Exception
被抓住但被抓住的那个) ,ans显示错误信息。
基本上它会再次打印"Enter a number"
等等。
警告强>
您还需要使用Scanner
的下一个值。
如果不这样做,使用continue
将永远循环,在发生错误时无需用户交互。
示例强>
Scanner read = new Scanner(System.in);
do {
try {
// trimmed out non-necessary stuff
System.out.println("Enter a number");
double i = Double.parseDouble(read.nextLine());
System.out.println(i);
// changed exception caught
}
catch (NumberFormatException type_error) {
System.out.println("Error. You cannot divide a letter by a number!");
continue;
}
} while (true);
最后的注释
如Berger所述,continue
此处甚至不需要,因为您只打印一条警告消息。
答案 2 :(得分:0)
break
语句导致循环结束。
break
语句有两种形式:标记和未标记。你看到了 在前面讨论的switch语句中没有标记的形式。您 也可以使用未标记的中断来终止 a for,while或do-while 环
解决方案:
将其更改为continue
。
continue
语句跳过for的当前迭代,而, 或者do-while循环。
答案 3 :(得分:0)
break
语句导致循环退出。由于您在try
- catch
构造之后的循环中没有代码,因此您只需删除break
语句。
请注意,Scanner
方法(我假设read
是Scanner
)nextDouble()
如果下一个标记代表双精度,则返回double值。如果没有,它会抛出异常而不消耗该令牌。因此,您需要确保使用下一个值,您可以使用read.next()
:
do{ //Begin loop
try{ //Try this code
System.out.println("Enter a number");
double i = read.nextDouble(); //Reads user input
double rn = r.nextInt(10); //Generates random number rn
System.out.println(i + " divided by random number " + rn + " is " + (i/rn));
}catch(InputMismatchException type_error){ //Catches error if there is a type mismatch
//Example error: if user enters a letter instead of a double
System.out.println("Error. You cannot divide " + read.next() + " by a number!");
}
} while(true);
答案 4 :(得分:0)
另一个解决方案是将SELECT Table2.id, Table2.child
FROM (SELECT MIN(id) AS master FROM Table1) AS Table1
INNER JOIN Table2
ON Table1.master = Table2.id
替换为break
。
read.nextLine();
语句导致循环结束。
break
会一次又一次打印continue
。
但是Enter a number
,代码会一次又一次地询问输入。
如果您删除read.nextLine();
或read.nextLine();
,代码会一次又一次打印输入数字。
答案 5 :(得分:-1)
删除休息时间;从那里,一切都会正常。
但请记住,在终止条件下,我不会在任何地方看到它。