以这种方式进行异常处理是否可接受?

3
假设我有一段代码,它接收用户输入并将其存储为整数。当用户输入其他内容时,会抛出NumberFormat异常。但是,由于我知道这可能发生,但除了检查它然后重新运行输入序列之外,我没有理由做任何事情,因此在do-while循环中放置try-catch并使布尔变量成为控制变量,这样做是否可行?是否存在这种异常处理可能会对我产生不利影响的情况?
伪代码:
Scanner scanner = new Scanner(System.in);
boolean inputMismatch;
int number;
do {
    try {
        System.out.println("Enter a number");
        number = Integer.parseInt(scanner.nextLine());
        inputMismatch = false;
    } catch (NumberFormatException e) {
        e.printStackTrace();
        inputMismatch = true;
    }

} while (inputMismatch);

2
不,这是这类应用程序的一个相当常见的用例。 - Kayaman
1
是的,对我来说看起来是一种可靠的方法论。 - Mad Physicist
如果有一种简单的方法可以检查而不需要捕获异常,请使用它(例如调用 file.exists() 来避免 FileNotFoundExdception)。然而,在你的情况下,没有这样的方法,所以捕获异常是合理的选择。 - Jiri Tousek
我个人更倾向于在输入无效时使用hasNextIntnext/nextLine,而不是捕获异常,但这只是我的个人意见。 - Tom
4个回答

3
这个方法可以,但是多了一个变量会有些繁琐。我会这样做:
Scanner scanner = new Scanner(System.in);
int number;
while(true) {
  try {
    System.out.println("Enter a number");
    number = Integer.parseInt(scanner.nextLine());
    break;
  } catch (NumberFormatException e) {
    System.err.println(e.getMessage());
  }
}

如果整数解析成功,控制流将跳出while循环,否则将打印错误信息。考虑打印消息而不是堆栈跟踪 - 用户会因为堆栈跟踪而感到困惑。


不要打印堆栈跟踪信息。我认为更进一步的说,因为异常已经被处理了,在catch中可能没有必要打印任何内容。 - djeikyb

3
如果您不在这个代码块中包含catch,那么它必须是一个级别 - 也就是说,某些内容必须执行此相同的循环并捕获异常。唯一的区别是它封装在一个会抛出运行时异常的方法中。
这样做应该完全没问题。您必须在某处处理无效的输入,而在这里看起来很好。

2

你的逻辑和代码看起来都很好。这段代码能够以最小的副作用实现你想要的功能。你也可以使用 forwhile 循环来避免在开始时出现未初始化的标志位。在 for 循环的情况下,标志位甚至不会存在于循环外:

Scanner scanner = new Scanner(System.in);
int number;
for(boolean inputMismatch = true; inputMismatch; ) {
    try {
        System.out.println("Enter a number");
        number = Integer.parseInt(scanner.nextLine());
        inputMismatch = false;
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
}

请注意,如果在循环之前将inputMismatch设置为true,则在每次循环失败时都不需要重置它。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接