首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以尝试catch用于代码优化吗?

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

Stack Overflow用户
提问于 2014-09-24 12:34:00
回答 3查看 200关注 0票数 1

假设我有以下课程:

代码语言:javascript
运行
复制
public class RectangularPrism{
    public Integer width;
    public Integer height;
    public Integer depth;

    //setters and getters
}

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

这一次使用条件运算符

代码语言:javascript
运行
复制
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;
    }

这一次使用尝试捕捉

代码语言:javascript
运行
复制
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个或更多的字段来决定结果,哪一个会更好?

使用尝试捕捉来处理空值可以吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-24 12:35:40

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

  1. try-catch实际上要慢一些(如果真的有异常抛出)
  2. 在非异常情况(即正常控制流)中使用异常,这在概念上是错误的。
  3. 如果try-catch块中还有什么抛出合法的NPE,您就无法知道发生了什么。(例如,假设prism本身为null的情况。)
  4. 仅仅从代码中找出您的意图是非常困难的。使用?:操作符检查空值是一个众所周知的模式,每个人都会认识到。
  5. 一个空的catch块是一个大的不-不,并且可能是生成big的最可靠的方法,需要很长时间才能找到。
  6. 在这种情况下,这两个代码段甚至不是等价的,因为在“异常驱动”的一个代码段中,一个null值将意味着跳过try块的其余部分。当然,sum仍将是正确的,但这只是一个巧合。

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

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

说真的,别说了。每次你这么做,一只可爱的小猫就死了。

票数 13
EN

Stack Overflow用户

发布于 2014-09-24 12:40:09

您不应该使用try-catch来处理程序的控制流。

始终使用已建立的方法,在本例中,检查null,就像在第一个代码示例中所做的那样。

票数 3
EN

Stack Overflow用户

发布于 2014-09-25 12:19:24

我知道这不会回答这个问题( try .. catch可以用于代码优化),但我认为您应该很少使用null值:如果widthheightdepth是对象的固有属性,则应该强制它们为非null

我的意思是,您正在构建一个RectangularPrismwidthheightdepth来定义这个对象。你不能让null在里面,否则它不会是长方形棱镜。

在这种情况下,我宁愿这样做:

代码语言:javascript
运行
复制
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    
}

或与策划人:

代码语言:javascript
运行
复制
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上的操作,而不是外部操作,那么您将有一个更好的实现。

这样做更正确:

代码语言:javascript
运行
复制
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,所以我不会在包装类上注释原语的使用):

代码语言:javascript
运行
复制
public Integer volumeSum(List<RectangularPrism> prismList) {
  int initial = 0;
  for (RectangularPrism p : prismList) 
    initial += p.computeVolume();
  return initial;
}

最后但并非最不重要的是,异常处理要慢得多,但是循环中的异常处理要慢得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26017043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档