我怎样才能保证一个方法returns一个值呢?

How can I ensure that a method returns a value?

我在下面编写的方法应该作用于 BinaryTreeNode 以展平树 'beneath' 该节点。根据我的理解,我的 if-else if-else 和递归 (?) 结构将始终 return 一个值,但我在 Eclipse 中收到错误提示“此方法必须 return 的结果输入 <Integer>

经过研究,我相信 Java 不能完全判断该方法总是 return 正确的值,因为 return 语句在 'else' .这是问题吗?我该如何设计方法来避免这个问题?

//doFlatten acts on a BinaryTreeNode and takes a storage list as an argument
//it will call itself on any children on the node
//if the node is a leaf, it will update the storage list and return that updated list
public List<Integer> doFlatten(List<Integer> result){
    if (this.leftChild != null){
        this.leftChild.doFlatten(result);
    }
    else if (this.rightChild != null){
        this.rightChild.doFlatten(result);
    }
    else{
        result.add(this.value); //add leaf to result list
        return result;
    }
}

最好的办法是定义方法的return类型的变量并初始化为默认值,在方法中为结果分配适当的值,最后,作为方法的最后一行,return这个变量。

对于您的方法,它可能如下所示:

public List<Integer> doFlatten(List<Integer> result) {
    List<Integer> realResult = new ArrayList<>(result);
    if (this.leftChild != null){
        this.leftChild.doFlatten(result);
    }
    else if (this.rightChild != null){
        this.rightChild.doFlatten(result);
    }
    else{
        result.add(this.value); //add leaf to result list
        realResult.add(this.value);
        //avoid return statement here
        //return result;
    }
    //single point for return statement
    return realResult;
}

但是,对于这种情况,正如您在上面的代码中看到的,即使 return 结果似乎也没有意义,因为此方法的正确结果存储在 List<Integer> result 中。所以,只要让你的方法 void:

public void doFlatten(List<Integer> result) {
    //rest of your code...
}

您的方法实际上并不总是 return 值(第一个 if 和第一个 else)没有 return。

这似乎是你想要的:

    public List<Integer> doFlatten(List<Integer> result){
        if (this.leftChild != null){
            this.leftChild.doFlatten(result);
        }
        else if (this.rightChild != null){
            this.rightChild.doFlatten(result);
        }
        else{
            result.add(this.value); //add leaf to result list
        }
        return result;
    }

使 return 键入 void 并删除 return result。不需要 return 结果对象,因为它与传入的结果对象相同(调用者已经引用了它)。

再次检查您的代码。您在最后一个 else 分支中只有一个 return 语句。这意味着你的方法 returns 只有在到达这一点时才有价值。这正是编译器向您报告的内容。

所以,问题 "how to ensure that my method returns value" 可以像 "compile your code" 那样回答。如果您设法编译代码,请确保您的方法确实 returns 值或抛出异常。

但是,如果您实际上是在询问可帮助您避免此类编译错误的最佳编码实践,恕我直言,没有 100% 正确的答案。

请参阅 Luigi Mendoza 的建议。在某些情况下,它们是好的。然而(对不起,路易吉)我不能同意他们总是好的。我会说你应该尽可能避免使用 if/else 结构。例如,在 if 块的末尾带有 return 的一系列 if 语句在某些情况下更具可读性。

我想你只是想要:

//doFlatten acts on a BinaryTreeNode and takes a storage list as an argument
//it will call itself on any children on the node
//if the node is a leaf, it will update the storage list and return that updated list
public List<Integer> doFlatten(List<Integer> result){
    if (this.leftChild != null){
        return this.leftChild.doFlatten(result);
    }
    else if (this.rightChild != null){
        return this.rightChild.doFlatten(result);
    }
    else{
        result.add(this.value); //add leaf to result list
        return result;
    }
}

请注意,在我的版本中,所有谓词结果都会导致返回 List<Integer>,而在您的情况下,只有 else 子句会返回。