java - try catch可以用来做代码优化吗?

标签 java nullpointerexception try-catch

假设我有以下类(class):

public class RectangularPrism{
    public Integer width;
    public Integer height;
    public Integer depth;

    //setters and getters
}

我用它来计算所有棱镜的体积总和。我有两种方法来计算这个。哪个更好?

这个使用条件运算符

public Integer volumeSum(List<RectangularPrism> prismList){
        Integer sum = 0;
        for(RectangularPrism prism: prismList){
            Integer width = prism.getWidth() == null ? 0 : prism.getWidth();
            Integer height = prism.getHeight() == null ? 0 : prism.getHeight();
            Integer depth = prism.getDepth() == null ? 0 : prism.getDepth();
            sum += width * height * depth;
        }
        return sum;
    }

这个使用try catch block

public Integer volumeSum(List<RectangularPrism> prismList){
        Integer sum;
        for(RectangularPrism prism: prismList){
            try {
                Integer width = prism.getWidth();
                Integer height = prism.getHeight();
                Integer depth = prism.getDepth();
                sum += width * height * depth;
            }catch( NullPointerException e){}
        }
        return sum;
    }

如果我的类(class)有 100 个或更多字段来确定结果,哪个更好?

使用 try catch 来处理 null 值可以吗?

最佳答案

这在各个层面上都是一个坏主意。

  1. try-catch其实比较慢(如果真的有异常抛出的话)
  2. 您在非异常情况下(即正常控制流)使用异常,这在概念上是错误的。
  3. 如果 try-catch block 中的任何其他内容抛出合法的 NPE,您将无法判断发生了什么。 (例如,想象一下 prism 本身为 null 的情况。)
  4. 仅从代码中很难弄清楚您的意图是什么。使用 ?: 运算符检查空值是一种公认​​的模式,每个人都会认可。
  5. 一个空的 catch block 是一个很大的禁忌,并且可能是产生需要很长时间才能追踪到的错误的最可靠方法。
  6. 在这种情况下,这两个片段甚至不等价,因为在“异常驱动”中,一个 null 值将意味着 try block 的其余部分将被跳过。当然 sum 仍然是正确的,但这只是巧合。

如果你真的想提高性能,不要使用Integer和其他包装类进行简单的计算,而是使用相应的原语(本例中为int)。这样做的额外好处是您突然不必再担心 null,因为原始值永远不会是 null

总结一下:永远不要这样做。

说真的,不要。每次你这样做,都会有一只可爱的小猫死去。 enter image description here

关于java - try catch可以用来做代码优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26017043/

相关文章:

java - 如何在java中将一个ArrayList的所有元素添加到另一个ArrayList中

asp.net - ex 与 ex.ToString 之间有什么区别吗? ASP.NET

java - throw 或尝试接住

java - Json 字符串到 Java 对象 Avro

java - 将 Freemarker 集成到 Spring mvc 时出错

java - 什么是NullPointerException,我该如何解决?

r - R 中的 tryCatch 无法正常工作

java - 将项目导出到 jar 文件,包括 javadoc

java - 正则表达式以字符串开头,匹配所有类型的符号、字符、数字

java - 我的界面触发时得到 NullPointerException