何时在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/else
, while
, for
等流控制语句来修复它们。
也可以看看:
- 什么时候抛出哪个例外?
- 例外教程
一如既往地“取决于”,你会发现许多不同的意见。 这是我的
- 例外分为两大类。
- 你可以合理预期和处理的事情(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]); }