Java:try-catch vs if-else用于初始化:性能

时间:2015-12-30 14:02:41

标签: java if-statement initialization try-catch

我听说使用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;
    }

代替?

编辑:我所知道的事情:

  • 在这个特定的例子中,如果vec的长度不一,可能会出现问题
  • 是的,我知道这是一个可怕的罪。

我不知道的事情:

  • 为什么这是一个如此可怕的罪?
  • 总是通过尝试(除了一次,分摊到什么都没有)比总是通过if(条件)
  • 更快

2 个答案:

答案 0 :(得分:7)

使用异常处理来实现业务逻辑是不好的做法。异常处理用于处理特殊情况。

在您的具体示例中,使用异常处理更加清楚,因为您在异常处理程序中复制了代码。

顺便说一句,你的方法有另一个潜在的问题。您无法保证在每次拨打add时都会收到相同长度的数组,因此您可能会忽略传递给您的方法的某些值,或者获取ArrayIndexOutOfBoundsException如果vec短于running_sum

答案 1 :(得分:0)

NullPointerExceptionArrayIndexOutOfBoundsException等运行时异常是程序中错误的指示器,因为您作为开发人员搞砸了。不是用户或某些外部因素,而是您的代码。

你永远不应该试图捕捉它们,你必须确保它们根本不会发生。如果它们发生,请跟踪它们并修复您的代码,以确保它们永远不会再次出现。

如果running_sum不能为null,则通过添加构造函数来强制执行该操作,该构造函数将值作为参数并检查非null。使用add方法没有任何东西来添加输入是没有意义的。