假设我有以下课程:
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;
}这一次使用尝试捕捉块
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;
}如果我的班级有100个或更多的字段来决定结果,哪一个会更好?
使用尝试捕捉来处理空值可以吗?
发布于 2014-09-24 12:35:40
这在各个层面上都是个坏主意。
try-catch实际上要慢一些(如果真的有异常抛出)try-catch块中还有什么抛出合法的NPE,您就无法知道发生了什么。(例如,假设prism本身为null的情况。)?:操作符检查空值是一个众所周知的模式,每个人都会认识到。catch块是一个大的不-不,并且可能是生成big的最可靠的方法,需要很长时间才能找到。null值将意味着跳过try块的其余部分。当然,sum仍将是正确的,但这只是一个巧合。如果您真的想提高性能,不要使用Integer和其他包装类来进行简单的计算,而是使用对应的原语(在本例中是int)。额外的好处是,您将不必再担心null的问题了,因为原始值永远不可能是null。
所以总结一下:永远不要这样做。
说真的,别说了。每次你这么做,一只可爱的小猫就死了。

发布于 2014-09-24 12:40:09
您不应该使用try-catch来处理程序的控制流。
始终使用已建立的方法,在本例中,检查null,就像在第一个代码示例中所做的那样。
发布于 2014-09-25 12:19:24
我知道这不会回答这个问题( try .. catch可以用于代码优化),但我认为您应该很少使用null值:如果width、height、depth是对象的固有属性,则应该强制它们为非null。
我的意思是,您正在构建一个RectangularPrism:width、height和depth来定义这个对象。你不能让null在里面,否则它不会是长方形棱镜。
在这种情况下,我宁愿这样做:
public class RectangularPrism {
private final Integer width;
private final Integer height;
private final Integer depth;
public RectangularPrism(Integer width, Integer height, Integer depth) {
this.width = Objects.requireNonNull(width, "width");
this.height = Objects.requireNonNull(height, "height");
this.depth = Objects.requireNonNull(depth, "depth");
}
// getters
}或与策划人:
public class RectangularPrism {
public Integer width;
public Integer height;
public Integer depth;
public void setWidth(Integer width) {
this.width = Objects.requireNonNull(width, "width");
}
}您不必处理null,因为JVM将抛出一个NullPointerException,而只有,因为对象没有完全/正确地初始化,而不是因为您没有处理不应该存在的null值。这是一种正常的行为,比如抛出一个IllegalStateException,因为对象处于不应该的状态(这里:因为您有null值)。
要完成,如果体积计算是RectangularPrism上的操作,而不是外部操作,那么您将有一个更好的实现。
这样做更正确:
public class RectangularPrism {
private final Integer width;
private final Integer height;
private final Integer depth;
public RectangularPrism(Integer width, Integer height, Integer depth) {
this.width = Objects.requireNonNull(width, "width");
this.height = Objects.requireNonNull(height, "height");
this.depth = Objects.requireNonNull(depth, "depth");
}
public Integer computeVolume() {
return width * height * depth; // can't be null.
}
}然后(我在那里使用了int,因为有一个sum,所以我不会在包装类上注释原语的使用):
public Integer volumeSum(List<RectangularPrism> prismList) {
int initial = 0;
for (RectangularPrism p : prismList)
initial += p.computeVolume();
return initial;
}最后但并非最不重要的是,异常处理要慢得多,但是循环中的异常处理要慢得多。
https://stackoverflow.com/questions/26017043
复制相似问题