如何确保方法返回值?

时间:2015-05-07 16:41:22

标签: java binary-tree

我在下面编写的方法应该在BinaryTreeNode上操作,以便在'之下压缩树。那个节点。根据我的理解,我的if-else if-else和递归(?)结构将始终返回一个值,但我在Eclipse中收到错误说"此方法必须返回类型为{{1}的结果}。

在做了研究之后,我认为Java不能完全告诉该方法将始终返回正确的值,因为return语句在' else'中。这是问题吗?我怎样才能设计出避免这个问题的方法?

<Integer>

5 个答案:

答案 0 :(得分:2)

制作返回类型void并删除return result。没有必要返回结果对象,因为它是传入的相同结果对象(调用者已经有了对它的引用)。

答案 1 :(得分:0)

最好的办法是使用方法的返回类型定义变量并将其初始化为默认值,在方法中指定结果的正确值,最后,作为方法的最后一行,返回此变量。

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

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

但是,对于这种情况,正如您在上面的代码中看到的那样,甚至返回结果似乎毫无意义,因为此方法的正确结果存储在List<Integer> result中。所以,只需制作方法void

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

答案 2 :(得分:0)

您的方法实际上并不总是返回一个值(第一个if和其他第一个)没有返回。

这似乎是你想要的:

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

答案 3 :(得分:0)

再次检查您的代码。在最后一个if分支中只有一个return语句。这意味着只有到达此点时,您的方法才会返回值。这正是编译器报告的内容。

因此,“如何确保我的方法返回值”的问题可以像“编译代码”一样回答。如果您设法编译代码,请确保您的方法确实返回值或抛出异常。

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

参见Luigi Mendoza的建议。在某些情况下,他们是好的。然而(抱歉,路易吉)我不能同意他们总是好的。我会说你应该尽可能避免使用if / else结构。例如,在if块结尾处返回的<div class="row"> <div class="col-xs-12 bg embed-responsive embed-responsive-16by9"></div> </div> 语句系列在某些情况下更具可读性。

答案 4 :(得分:0)

我想你只是想:

//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子句会返回。