可以尝试catch用于代码优化吗?

ner*_*sol 1 java try-catch nullpointerexception

让我们说我有以下课程:

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

    //setters and getters
}
Run Code Online (Sandbox Code Playgroud)

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

这个使用条件运算符.

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;
    }
Run Code Online (Sandbox Code Playgroud)

这个使用try catch

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;
    }
Run Code Online (Sandbox Code Playgroud)

哪一个会更好如果我的班级有100个或更多的字段来决定结果?

使用try catch来处理值是没关系的吗?

biz*_*lop 13

这在每个级别都是一个坏主意.

  1. try-catch 实际上速度较慢(如果确实存在异常抛出)
  2. 您在非特殊情况下使用异常(即正常控制流),这在概念上是错误的.
  3. 如果try-catch块中的任何其他内容抛出合法的NPE,则无法告知发生了什么.(想象一下例如当prism它本身为空时的情况.)
  4. 很难从单独的代码中弄清楚你的意图是什么.使用?:运算符检查空值是一个众所周知的模式,每个人都会认识到.
  5. catch块是一个很大的禁忌,可能是最可靠的生成错误的方法,需要花费很长时间来追踪.
  6. 在这种情况下,两个片段甚至不等同,因为在"异常驱动"中,一个null值将意味着try将跳过块的其余部分.当然,sum这仍然是正确的,但这只是巧合.

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

总而言之:永远不要这样做.

说真的,不要.每次你这样做,一只可爱的小猫死了. 在此输入图像描述