何时在Java中使用异常(示例)

时间:2010-07-09 13:37:41

标签: java exception exception-handling

我知道这会是不好的做法,虽然我知道我无法解释原因。

int [] intArr = ...
...
try{
   int i = 0;
   while(true){
      System.out.println(intArr[i++]);
   }
}catch(ArrayIndexOutOfBoundsException e){}

我认为你只应该对不应该发生的事情使用例外。我问这个问题是因为我认为我有时会使用异常错误。如果您的编程正在运行标准情况应该抛出异常?

这似乎有关: Preventing exceptions vs. catching exceptions in Java

10 个答案:

答案 0 :(得分:20)

你是对的:异常是指,例如,例外的案例。使用它们来控制正常的控制流程不仅模糊了代码的意图(这已经足以使其取消资格),而且速度也慢得多,因为抛出和捕获异常代价很高。

标准习语(在Java5及以上版本中)使用 foreach 循环:

for (int i : intArr) {
  System.out.println(i);
}

答案 1 :(得分:5)

这是错误的,因为你知道最终循环将到达intArr的最后一个元素,所以这里没有异常,你实际上是<强烈>期待这种行为。

答案 2 :(得分:5)

当涉及RuntimeException时,捕获例外只是一种不好的做法。你试图赶上的ArrayIndexOutOfBoundsException就是一个。

RuntimeExceptions识别由代码流中的错误引起的可编程恢复的问题。你不应该通过捕获它们来修复它们,而是通过编写适当的代码并使用流程控制语句,如if/elsewhilefor等。

另见:

答案 3 :(得分:3)

一如既往地“取决于”,你会发现许多不同的意见。这是我的

  • 例外情况分为两大类。
    • 您可以合理预期和处理的事情(FileNotFoundException)
    • 假设完美代码(ArrayIndexOutOfBounds)
    • ,你通常不反对的事情

您通常希望处理第一类而不是后者。后者通常是编程错误。

你的例子属于后一种情况,编程错误。该异常旨在提供有关运行时故障的良好信息,而不是作为控制流。

有些人会说第一个是经过检查的例外,第二个是未经检查的。我不同意这一点。我几乎总是发现已检查的异常是现实中的痛苦,因为您几乎总是最终执行catch / wrap / rethrow到另一个异常类型。当抛出异常并定义我自己的异常类时,我几乎总是使用未选中的。

答案 4 :(得分:1)

你是对的。不应使用例外来处理流程。

答案 5 :(得分:1)

以你的方式吃异常通常被认为是一种不好的做法:如果你不需要做任何进一步的治疗,你可以记录它。

答案 6 :(得分:1)

仅在特殊情况下,

  • 当一个方法不能做它应该做的事情时
  • 不控制执行流程

答案 7 :(得分:1)

异常应该捕获异常,记录并尽可能恢复。

如果它是正常程序流程的一部分,你应该正常处理它。

答案 8 :(得分:1)

代码中的例外例外。不适用于标准情况。

然而,你的代码还有一个更严重的问题,它没有使用异常就会慢一些。创建异常,抛出异常并捕获异常需要额外的CPU和MEMORY。

此外,对于只会在错误情况下抛出异常的其他程序员来说,代码变得更难阅读。

答案 9 :(得分:1)

到达数组的末尾并不是特例。你知道开始循环之前的长度,所以只需使用一个标准的习语。

for(int i = 0; i < intArr.length; ++i) {
    System.out.println(intArr[i]);
}