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

时间:2015-10-27 19:52:51

标签: java exception exception-handling

让我们说我有一段代码接受用户输入并将其存储在整数中。现在,当用户输入其他内容时,会抛出NumberFormat异常。但是因为我知道这可能会发生,但除了检查它然后重新运行输入序列之外我没有理由对它做任何事情,将try-catch置于{{1}内部是否是一个可怕的想法循环并将布尔值设为控制变量?是否存在这种异常处理可能适得其反的情况?

的伪代码:

do-while

4 个答案:

答案 0 :(得分:3)

如果你不打算在这段代码中包含catch,那么它必须是一级 - 也就是说,某些事情必须做同样的循环并抓住例外。唯一的区别是它被封装在一个会抛出运行时异常的方法中。

这应该是完全没问题的。你必须处理无效输入某处,这里看起来很好。

答案 1 :(得分: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循环,否则将打印错误。考虑打印消息而不是堆栈跟踪 - 用户会对堆栈跟踪感到困惑。

答案 2 :(得分: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

答案 3 :(得分:1)

我认为这绝对没问题。

您可以将解析逻辑封装在其他位置,以便错误处理可能更明确一些。

这是关于封装的参考:

Java: Good way to encapsulate Integer.parseInt()