我听说使用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与使用:
是否会更快 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;
}
代替?
编辑:我所知道的事情:
我不知道的事情:
答案 0 :(得分:7)
使用异常处理来实现业务逻辑是不好的做法。异常处理用于处理特殊情况。
在您的具体示例中,使用异常处理更加清楚,因为您在异常处理程序中复制了代码。
顺便说一句,你的方法有另一个潜在的问题。您无法保证在每次拨打add
时都会收到相同长度的数组,因此您可能会忽略传递给您的方法的某些值,或者获取ArrayIndexOutOfBoundsException
如果vec
短于running_sum
。
答案 1 :(得分:0)
NullPointerException
或ArrayIndexOutOfBoundsException
等运行时异常是程序中错误的指示器,因为您作为开发人员搞砸了。不是用户或某些外部因素,而是您的代码。
你永远不应该试图捕捉它们,你必须确保它们根本不会发生。如果它们发生,请跟踪它们并修复您的代码,以确保它们永远不会再次出现。
如果running_sum
不能为null,则通过添加构造函数来强制执行该操作,该构造函数将值作为参数并检查非null。使用add
方法没有任何东西来添加输入是没有意义的。