我知道这会是不好的做法,虽然我知道我无法解释原因。
int [] intArr = ...
...
try{
int i = 0;
while(true){
System.out.println(intArr[i++]);
}
}catch(ArrayIndexOutOfBoundsException e){}
我认为你只应该对不应该发生的事情使用例外。我问这个问题是因为我认为我有时会使用异常错误。如果您的编程正在运行标准情况应该抛出异常?
这似乎有关: Preventing exceptions vs. catching exceptions in Java
答案 0 :(得分:20)
你是对的:异常是指,例如,例外的案例。使用它们来控制正常的控制流程不仅模糊了代码的意图(这已经足以使其取消资格),而且速度也慢得多,因为抛出和捕获异常代价很高。
标准习语(在Java5及以上版本中)使用 foreach 循环:
for (int i : intArr) {
System.out.println(i);
}
答案 1 :(得分:5)
这是错误的,因为你知道最终循环将到达intArr
的最后一个元素,所以这里没有异常,你实际上是<强烈>期待这种行为。
答案 2 :(得分:5)
当涉及RuntimeException
时,捕获例外只是一种不好的做法。你试图赶上的ArrayIndexOutOfBoundsException
就是一个。
RuntimeExceptions
识别由代码流中的错误引起的可编程恢复的问题。你不应该通过捕获它们来修复它们,而是通过编写适当的代码并使用流程控制语句,如if/else
,while
,for
等。
答案 3 :(得分:3)
一如既往地“取决于”,你会发现许多不同的意见。这是我的
您通常希望处理第一类而不是后者。后者通常是编程错误。
你的例子属于后一种情况,编程错误。该异常旨在提供有关运行时故障的良好信息,而不是作为控制流。
有些人会说第一个是经过检查的例外,第二个是未经检查的。我不同意这一点。我几乎总是发现已检查的异常是现实中的痛苦,因为您几乎总是最终执行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]);
}