gpt4 book ai didi

java - Java中如何处理异常而不必回到try block 的开头?

转载 作者:行者123 更新时间:2023-12-01 18:28:16 25 4
gpt4 key购买 nike

我已经在我的程序中实现了异常处理,但现在我遇到的问题是,当异常发生并在 catch block 中处理时,它不会从发生的地方继续,而是返回到开头程序,因此在 catch block 中所做的任何更改都是无用的。

简单的例子

public class Example {
public static void main(String[] args) {
int x;
boolean repeat = true;
Scanner input = new Scanner();
do {
try {
x = input.nextInt();
System.out.println("Success!");
repeat = false;
}
catch(InputMismatchException e) {
System.out.println(e.getMesasge());
system.out.println("\nYou must enter an integer");

//BTW am I correct in thinking the following clears the buffer?

input.nextLine();
x = input.nextInt();
}
} while (repeat);

但是如果我这样做,程序将返回到 do block 的开头,从而重置 X 的值,而不是从成功消息所在的行继续。

我知道这是因为重复 boolean 值当时为真,因此触发了 while 条件重新开始,但如果我在 catch block 内将其设置为 false,则可能会遇到未处理的异常因为有人仍然可以尝试输入无效的内容。

一旦catch block 处理了异常,有没有办法在抛出异常的行之后返回控制权?

最佳答案

如果您的应用程序将有多个用户输入,那么您应该有多个循环来处理每个输入,因为每个输入都有可能出错并生成异常。

在大多数情况下,如果由于用户输入而发生异常,那么保存该输入的变量中的值无论如何都是不需要的,因为它显然是错误的,或者至少已经降至其初始化的默认值。在这种情况下,通常您希望让用户有机会提供正确的输入。如果不是,则不要将提示放入循环中。

Scanner input = new Scanner(System.in);
String ls = System.lineSeparator();

// We want the User to enter an inclusive number from 1 to 5.
int x = 0;
while (x < 1 || x > 5) {
System.out.print("Enter an Integer Number from 1 to 5: --> ");
try {
x = input.nextInt();
input.nextLine(); // Consume ENTER.
System.out.println("Success! The nextInt() method accepted your input!");
if (x < 1 || x > 5) {
System.err.println("But...this application does not accept it!");
System.err.println("We asked for a number from 1 to 5! Try again..." + ls);
}
}
catch (InputMismatchException ex) {
System.out.println(ex.getMessage());
System.err.println("Invalid Input! An Integer number from 1 to 5 only!" + ls);

//BTW am I correct in thinking the following clears the buffer?
/* YES you are since the nextInt() method does not consume the
the newline character provided by the ENTER key like the nextLine()
method does and therefore provides it on the next input request
which in this case ultimately generates an endless loop of exceptions.
Even if this prompt was successful and control is passed on to the
next prompt and if that prompt was a nextLine() method then it would
be basically skipped over because it would then consume that ENTER
key newline character provided in the last nextInt() method. So
with that in mind, it doesn't hurt to place input.nextline();
directly after the x = input.nextInt(); ether. */
input.nextLine(); // Consume ENTER.
}
}
System.out.println(x + " Was Supplied! - DONE!");

虽然有时它是有目的的,但我个人还是尽量避免针对异常。我认为如果可以的话最好避免它们,这就是为什么对于控制台应用程序我更喜欢只使用 Scanner#nextLine()接受所有键盘输入的方法,例如:

Scanner input = new Scanner(System.in);
String ls = System.lineSeparator();

// Prompt 1:
// We want the User to enter an inclusive number from 1 to 5.
int x = 0;
String userIN = "";
while (x < 1 || x > 5) {
System.out.print("Enter an Integer Number from 1 to 5 (q to quit): --> ");
userIN = input.nextLine();
if (userIN.toLowerCase().charAt(0) == 'q') {
System.out.println("Quitting!");
System.exit(0);
}
// Is it a signed or unsigned integer number with 1 or more digits?
if (userIN.matches("-?\\d+")) {
System.out.println("Success! The nextLine() method accepted your input" + ls
+ "to be a string representation of an Integer value!");
x = Integer.parseInt(userIN);
}
else {
System.err.println("Invalid Input! An Integer number from 1 to 5 only!" + ls);
continue;
}
if (x < 1 || x > 5) {
System.err.println("But...this application does not accept it!");
System.err.println("We asked for a number from 1 to 5! Try again..." + ls);
}

}
System.out.println(x + " Was Supplied! - DONE!" + ls);

// Prompt 2:
// We want the User to enter any float or double type numerical value.
double d = Double.MIN_VALUE;
while (d == Double.MIN_VALUE) {
System.out.print("Enter a float or double type number (q to quit): --> ");
userIN = input.nextLine().toLowerCase().trim();
if (userIN.charAt(0) == 'q') {
System.out.println("Quitting!");
System.exit(0);
}
// Get rid of the type designator from value if it exists.
if (userIN.endsWith("f") || userIN.endsWith("d")) {
userIN = userIN.substring(0, userIN.length() - 1);
}
// Is it a signed or unsigned integer, float, or double type number?
if (userIN.matches("-?\\d+(\\.\\d+)?")) {
System.out.println("Success! The nextLine() method accepted your input" + ls
+ "to be a string representation of an Integer, float," + ls
+ "or double type value!");
d = Double.parseDouble(userIN);
}
else {
System.err.println("Invalid Input! A Float or Double type numerical value is required!" + ls);
d = Double.MIN_VALUE;
}
}
System.out.println(d + " Was Supplied! - DONE!");

关于java - Java中如何处理异常而不必回到try block 的开头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60200999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com