假设我有以下类(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 值可以吗?
最佳答案
这在各个层面上都是一个坏主意。
try-catch
其实比较慢(如果真的有异常抛出的话)- 您在非异常情况下(即正常控制流)使用异常,这在概念上是错误的。
- 如果
try-catch
block 中的任何其他内容抛出合法的 NPE,您将无法判断发生了什么。 (例如,想象一下prism
本身为 null 的情况。) - 仅从代码中很难弄清楚您的意图是什么。使用
?:
运算符检查空值是一种公认的模式,每个人都会认可。 - 一个空的
catch
block 是一个很大的禁忌,并且可能是产生需要很长时间才能追踪到的错误的最可靠方法。 - 在这种情况下,这两个片段甚至不等价,因为在“异常驱动”中,一个
null
值将意味着try
block 的其余部分将被跳过。当然sum
仍然是正确的,但这只是巧合。
如果你真的想提高性能,不要使用Integer
和其他包装类进行简单的计算,而是使用相应的原语(本例中为int
)。这样做的额外好处是您突然不必再担心 null
,因为原始值永远不会是 null
。
总结一下:永远不要这样做。
说真的,不要。每次你这样做,都会有一只可爱的小猫死去。
关于java - try catch可以用来做代码优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26017043/