我的 Return 语句无法访问

My Return Statement is Unreachable

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);
}

我知道 return 语句之后的任何内容都是无法访问的代码,但我唯一的 return 语句是无法访问的,我不明白为什么。 while 循环之所以如此,是因为我抓住了救命稻草,我知道它可能不会执行我想要它执行的操作。 myOrders 是一个 ArrayList。

编辑:由于 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);
}

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

清理eclipse解决了问题。

发布的代码中没有任何内容可以解释错误。 既然你说你的 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);