【问题标题】:How to return nothing from a function that returning value?如何从返回值的函数中不返回任何内容?
【发布时间】:2013-12-16 22:22:55
【问题描述】:

我有一棵二叉搜索树,我想删除一个节点。

我需要得到它的父母,所以我写了一个函数:

private BSTreeNode<T> getParent(BSTreeNode<T> root, BSTreeNode<T> node) {
        if(root == null) 
            return null;
        if(node.element().lessThan(root.element())) {
            if(root.getLeft() != null && root.getLeft().element().equal(node.element())) 
                return root;
            else
                getParent(root.getLeft(), node);
        } else {
            if(root.getRight() != null && root.getRight().element().equal(node.element()))
                return root;
            else
                getParent(root.getRight(), node);
        }
    }

与 C/C++ 不同,Java 出现以下错误:

This method must return a result of type BSTreeNode<T>

它迫使我在函数的最后一行返回一个值。

如何在我的函数上下文中修复它?

【问题讨论】:

  • 使用return getParent...
  • @SotiriosDelimanolis 并使用哪些参数?
  • 我不知道,那是你设计的一部分。关键是如果您的返回类型不同于void,您的方法必须始终返回一些内容。
  • C 和 C++ 编译器可能不会强制您为非 void 返回类型返回值,但这并不意味着它是“允许的”。如果函数在没有返回(或异常)的情况下终止,则结果未定义。 Java 只是特别热衷于执行此规则。
  • @SotiriosDelimanolis 哦,我的错。我困惑了一分钟,我必须在所有 else-if 块中返回值。非常感谢!

标签: java binary-search-tree


【解决方案1】:

您的函数不会针对所有可能的情况返回。你有:

if (null)...

if (less than root)...
else ( if ...)
       else (no return!)

如果它不为null,你返回什么,然后进入最后的else?没有返回任何内容。

您可以在 else 语句中使用return getParent...。或 return null 在函数末尾(不在 if 或 else 语句中)

我经常看到这样的代码来覆盖 if 语句都没有返回值的事件。

public int getAnswer()
{
    if (answer.equals("yes"))
        return 0;
    else if (answer.equals("no"))
        return 1;

    return null;
}

【讨论】:

  • 没错。您需要在 if/else 语句的每个分支中都有返回值。
【解决方案2】:

你应该擅长这个:

private BSTreeNode<T> getParent(BSTreeNode<T> root, BSTreeNode<T> node) {
    if(root == null) 
        return null;
    if(node.element().lessThan(root.element())) {
        if(root.getLeft() != null && root.getLeft().element().equal(node.element())) 
            return root;
        else
            return getParent(root.getLeft(), node);
    } else {
        if(root.getRight() != null && root.getRight().element().equal(node.element()))
            return root;
        else
            return getParent(root.getRight(), node);
    }
}

【讨论】:

    【解决方案3】:

    添加返回null;在方法结束时声明。 我认为这个语句在正常情况下是无法访问的,但添加它只是为了修复编译错误并尝试会发生什么。

    private BSTreeNode<T> getParent(BSTreeNode<T> root, BSTreeNode<T> node) {
            if(root == null) 
                return null;
            if(node.element().lessThan(root.element())) {
                if(root.getLeft() != null && root.getLeft().element().equal(node.element())) 
                    return root;
                else
                    getParent(root.getLeft(), node);
            } else {
                if(root.getRight() != null && root.getRight().element().equal(node.element()))
                    return root;
                else
                    getParent(root.getRight(), node);
            }
    return null;
        }
    

    【讨论】:

    • 它总是返回null
    • No man , 好好检查一下,return 语句只有在所有条件都失败时才会执行,这显然与您在上面支持的答案相同。所以请删除反对票:)
    猜你喜欢
    • 2023-03-27
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多