我的退货声明无法访问

时间:2015-10-17 06:01:40

标签: java return unreachable-code

public BigDecimal calculateTotal() {
    BigDecimal percent = BigDecimal.valueOf(0.9);
    int i = 0;
    BigDecimal price = BigDecimal.valueOf(0.0);
    while(!myOrders.isEmpty()){
        if (!myOrders.get(i).getItem().isBulk() && myMembership == true){
            price = price.add(myOrders.get(i).calculateOrderTotal().multiply(percent));
            myOrders.remove(i);
        }
        else{
            price = price.add(myOrders.get(i).calculateOrderTotal());
            myOrders.remove(i);
        }
    }
    //WHY IS THIS UNREACHABLE?!
    return price.setScale(2, RoundingMode.HALF_EVEN);
}

我知道返回语句之后的任何内容都是无法访问的代码,但我唯一的返回语句是无法访问的,我无法弄清楚原因。 while循环是这样的,因为我正在抓住稻草,我知道它可能不会做我想做的事情。 myOrders是一个ArrayList。

4 个答案:

答案 0 :(得分:2)

编辑:由于OP表示它是ArrayList,我的回答不再适用。

您永远不会更新索引i。这应该有效:

public BigDecimal calculateTotal() {
    BigDecimal percent = BigDecimal.valueOf(0.9);
    int i = 0;
    BigDecimal price = BigDecimal.valueOf(0.0);
    while(!myOrders.isEmpty()) {
        if (!myOrders.get(i).getItem().isBulk() && myMembership == true) {
            price = price.add(myOrders.get(i).calculateOrderTotal().multiply(percent));
            myOrders.remove(i);
        } else {
            price = price.add(myOrders.get(i).calculateOrderTotal());
            myOrders.remove(i);
        }
        i++;    // <-- You were missing this
    }
    // Not unreachable anymore :)
    return price.setScale(2, RoundingMode.HALF_EVEN);
}

答案 1 :(得分:2)

您的变量i永远不会增加。根据Collection myOrders的类型,每次删除第0个元素可能不会移动集合中的元素,myOrders将永远不会为空。

答案 2 :(得分:1)

发布的代码中没有任何内容可以解释错误。 既然你说IDE是Eclipse,我建议清理项目。 此外,请确保在查看此错误之前修复所有其他错误。 这个错误没有意义, 我怀疑你的项目中有其他编译错误, 这在某种程度上导致这是一个奇怪的副作用。 在你解决了其他问题之后,这个应该自然消失。

不过,为了看得更清楚,这里是相同代码的清理版本,做了完全相同的事情:

BigDecimal percent = BigDecimal.valueOf(0.9);
BigDecimal price = BigDecimal.ZERO;

while (!myOrders.isEmpty()) {
    Order first = myOrders.get(0);
    BigDecimal subtotal = first.calculateOrderTotal();
    if (!first.getItem().isBulk() && myMembership) {
        subtotal = subtotal.multiply(percent);
    }
    price = price.add(subtotal);
    myOrders.remove(0);
}
return price.setScale(2, RoundingMode.HALF_EVEN);

答案 3 :(得分:-1)

清洁日食解决了这个问题。