何时在Java中使用exception(示例)

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

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

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

这似乎是相关的: 防止exception与捕获Java中的exception

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

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

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

这是错误的,因为你知道最终循环将到达intArr的最后一个元素,所以在这里没有什么特别的,你实际上期待这种行为。

当涉及RuntimeException时,捕获exception只是一种不好的做法。 您尝试捕获的ArrayIndexOutOfBoundsException是一个。

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

也可以看看:

  • 什么时候抛出哪个例外?
  • 例外教程

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

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

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

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

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

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

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

只有在特殊情况下,

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

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

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

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

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

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

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

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