Java 要求返回一个值,即使该值在 if-else 梯形图中返回

问题描述 投票:0回答:6

我试图用java编写AVL树,有些东西动摇了我对基本编程的理解。当我在 if-else 梯形图的 else 块中已有 return 语句时,为什么 Java 会强制我返回一个值。我尝试调试,它按预期工作,它永远不会进入 if-else 块之外的 returns 语句。我一直在研究java,但从未意识到这一点。 我什至不确定这是否一直存在还是新的?我还阅读了一些博客,其中说如果您从 else 块返回值,则不必返回值。

The error which I get is I skip the last return statement.
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    This method must return a result of type AVLNode

https://javahungry.blogspot.com/2019/12/missing-return-statement-in-java.html 查看此链接上的最后一个示例。

public class AVL 
{
    AVLNode root;
    
    private AVLNode insert ( AVLNode current,int val)
    {
        if ( current == null)
        {
            return new AVLNode(val, 0, null, null);
        }
        else if ( val < current.val)
        {
            current.left = insert ( current.left, val);
        }
        else if ( val > current.val)
        {
            current.right = insert ( current.right, val);
        }
        else
        {
            return current;
        }
        return current;     // I don't want to return you ////      
    }


public void  add ( int val)
    {
        this.root = insert ( this.root, val);
    }
java if-statement return
6个回答
1
投票

出现此错误的原因是,如果您没有最终的

return
语句,并且最终进入了
if
块之一,那么您永远不会击中
else
,因此也永远不会击中
return 
声明。

尝试单步执行代码,其中同时指定了

current.val
val
,但它们是两个不同的值,例如
current.val = 2
val = 1

在这种情况下,执行将跳过第一个

if
(因为
current
不是
null
),然后进入第二个
if
块(因为
val > current.val
)。因为满足了其中一个
if
条件,所以我们将跳过下面的
else if
else
,并点击最后的
return
语句。如果没有该声明,我们将永远不会退回任何东西。

这与您引用的示例不同的原因是因为该示例在

return
if
块中都有
else
,因此无论发生什么情况,您总是会遇到
return
语句。您可以通过在两个
return current;
块中添加
else if
来实现相同的效果,尽管最后只有一个 return 会更干净。

基本上,如果您有一组

if...else if...else if...else
,则执行将仅访问其中一个块。无论执行代码的哪条路径都必须始终有
return


1
投票

你要么使用

否则

    {
        return current;
    }

    return current;   

所以在我看来,你的“if-else”是一种为变量“current”设置正确值的条件方法,所以使用“else”返回目的有点奇怪,所以你的代码可以重构为这样:使用if-else 捕获条件中所有可能的情况,在每种情况下设置变量,然后在完成后返回值,例如:

private AVLNode insert ( AVLNode current,int val)
{
    if ( current == null)
    {
        return new AVLNode(val, 0, null, null);
    }
    else if ( val < current.val)
    {
        current.left = insert ( current.left, val);
    }
    else if ( val > current.val)
    {
        current.right = insert ( current.right, val);
    }
         
    return current;     
}

0
投票

干净代码的原则之一是

method should have only one return statement
所以即使你的代码很好并且可以工作,如果你这样做会更好

private AVLNode insert ( AVLNode current,int val)
    {
       AVLNode returningObject = current;

        if ( current == null) {
            current = new AVLNode(val, 0, null, null);
        } else if ( val < current.val) {
            current.left = insert ( current.left, val);
        } else if ( val > current.val) {
            current.right = insert ( current.right, val);
        }
   
        return returningObject ;       
    }

这解决了问题

  // I don't want to return you ////

但是你的问题出现了,因为Java是

smart enough
在运行代码之前检查你的所有语句,如果你将所有
returns
放入块语句
Java knows
,那么存在你的语句无法实现并强制执行的情况你总是从方法中返回一些东西。

这是我能解释的最简单的方式。


0
投票

insert ()
的所有递归调用迟早都会在包含
return
的分支之一上结束(或者为了便于讨论,我们假设这一点)。
我认为你的误解是这就足够了。
但每一级递归调用都必须有自己的
return

所以这两行

current.left = insert ( current.left, val);
/* ... */
current.right = insert ( current.right, val);

每个还需要一个

return
,为了从执行调用的级别返回,最深嵌套递归调用级别隐含的
return
仅适用于该级别。


0
投票

而且不仅仅适用于 Java。当你有一个像OP中的那样的嵌套结构时,当它匹配第一个“if”并沿着嵌套的if-then-else-if梯子开始时,那么它“永远不会”会以某种方式落入“else” ' 与顶级 'if' 语句匹配,因为它已经评估了该条件并选择了其执行路径。 您正在测试的条件是独立且不相关的,因此根本不需要

else

构造。一旦我们处理了 null 情况并返回了一个新的 AVLNode,它们只是简单的未连接的

if
语句,有条件地修改
current
的状态。
private AVLNode insert ( AVLNode current, int val) {

   if (current == null) {
      return new AVLNode(val, 0, null, null);
   }

   if (val < current.val) {
      current.left = insert(current.left, val);
   }

   if (val > current.val) {
      current.right = insert(current.right, val);
   }

   // nothing changes when val == current.val, is this correct?

   return current;      
}



0
投票
[电子邮件受保护]

或WhatsApp +2349024827182,从他那里获取草药,他的网站是https://drosakaherbalhome9.wixsite.com/doctor-osaka

© www.soinside.com 2019 - 2024. All rights reserved.