【发布时间】:2015-12-30 14:02:40
【问题描述】:
我听说对正常程序流程中可能发生的任何事情使用 try-catch 是一种罪过,应该使用 if-else 代替。
但是,如果我们想将它用于初始化(仅发生一次且仅发生一次的事件),那又如何呢?当您初始化依赖于第一个传入数据时,您可能希望这样做,如下例所示:
class RunningVectorSum{
double[] running_sum;
public double[] add(double vec[]){
try{
for (int i=0; i<running_sum.length; i++)
running_sum[i]+=vec[i];
}
catch(NullPointerException ex){
running_sum = new double[vec.length];
for (int i=0; i<running_sum.length; i++)
running_sum[i] = vec[i];
}
return running_sum;
}
}
在这种情况下,从长远来看,使用 try-catch 是否会比 using 更快:
public double[] add(double vec[]){
if (running_sum==null)
running_sum = new double[vec.length];
for (int i=0; i<running_sum.length; i++)
running_sum[i]+=vec[i];
return running_sum;
}
改为?
编辑:我知道的事情:
- 是的,在这个特定示例中,如果 vec 的长度不同,则可能会出现问题
- 是的,我知道这是一个可怕的罪过。
我不知道的事情:
- 为什么会有如此可怕的罪过?
- 总是通过一次尝试(除了一次,它不会摊销)是否比总是通过 if(condition) 更快
【问题讨论】:
-
抛出异常是有代价的,我可能确信使用
if更清晰、更快捷。 -
当您可以检查
null时捕获NullPointerException既复杂又缓慢。你为什么要这样做?现代 Java 8 解决方案是使用Optional... -
catch(NullPointerException ex)- waaaaaaaaaaaaaargh。这是一个非常大的NONO。 -
好吧好吧为什么是这样一个NONO?
-
@Peter 因为不清楚。它很慢。这是不必要的。在这种特殊情况下,它显然违反了 DRY。
标签: java if-statement initialization try-catch