【问题标题】:Java: try-catch vs if-else for initialization: performanceJava:用于初始化的 try-catch 与 if-else:性能
【发布时间】: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


【解决方案1】:

使用异常处理来实现业务逻辑是一种不好的做法。异常处理就是处理异常情况。

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

顺便说一句,您的方法还有另一个潜在问题。您无法保证在每次调用 add 时都会收到相同长度的数组,因此您可能会忽略传递给您的方法的某些值,或者如果 vec 更短,则可能会得到 ArrayIndexOutOfBoundsExceptionrunning_sum

【讨论】:

  • 可能值得一提Optional.computeIfAbsent
【解决方案2】:

NullPointerExceptionArrayIndexOutOfBoundsException 这样的运行时异常表明您的程序中存在错误,因为您作为开发人员搞砸了。不是用户或某些外部因素,而是您的代码。

你永远不应该试图抓住它们,你必须确保它们根本不会发生。如果它们发生,请追踪它们并修复您的代码,以确保它们不再发生。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多