【问题标题】:Missing return statment缺少退货声明
【发布时间】:2013-07-11 05:56:45
【问题描述】:

我用 Java 写了这个小程序作为练习(它模拟了 7 个电子逻辑门),因为我目前正在学习它。但是当我尝试编译它时,它给了我几个错误,指出 "MISSING RETURN STATEMENT",但仅适用于具有 2 个 if 语句(AND、OR、NAND 和 NOR)的子例程。我想知道是否有一些关于 Java if 语句我不知道的东西。我也想知道在 Java 中是否有办法像在 C 中那样做if(X && Y)。无论如何,这里是代码:

package logic;
public class logic {
    boolean AND(boolean A, boolean B) {
        if(A==true) {
            if(B==true)
                return true;
        }
        else
            return false;
    }
    boolean OR(boolean A, boolean B) {
        if(A==false) {
            if(B==false)
                return false;
        }
        else
            return true;
    }
    boolean NOT(boolean A) {
        if(A==true)
            return false;
        else
            return true;
    }
    boolean NAND(boolean A, boolean B) {
        if(A==true) {
            if(B==true)
                return false;
        }
        else
            return true;
    }
    boolean NOR(boolean A, boolean B) {
        if(A==false) {
            if(B==false)
                return true;
        }
        else
            return false;
    }
    boolean XOR(boolean A, boolean B) {
        if(A==B)
            return false;
        else
            return true;
    }
    boolean XNOR(boolean A, boolean B) {
        if(A==B)
            return true;
        else
            return false;
    } 
}

和错误信息:

logic/logic.java:10: error: missing return statement
    }
    ^
logic/logic.java:18: error: missing return statement
    }
    ^
logic/logic.java:32: error: missing return statement
    }
    ^
logic/logic.java:40: error: missing return statement
    }
    ^
4 errors  

接受所有帮助或建议。

由于某种原因,当我尝试使用if(A==true && B==true)之前它不起作用,但现在它可以了。

【问题讨论】:

  • 对于ANDreturn A && B、对于ORreturn A || B等,还是完全省略函数?
  • A == true 是多余的,可以简化为A
  • @Dukeling 不过这只是个人喜好问题
  • @RichardTingle 请不要。在我处理的任何代码中,无论我在哪里看到== true== false(显然替换为!...),我都会着迷地删除它。
  • @RichardTingle if (John.isHuman == true) 用词——“如果约翰是人类是真的”。我不了解你,但这不是我说话的方式,因此不是我编码的方式。尽管您对!something 有意见,尽管它只适用于不熟悉此类语法的程序员,但您已经习惯了足够快地阅读!

标签: java if-statement return


【解决方案1】:

Java 与 Python 不同,Python 的编译器理解代码块是通过简单的缩进表示的。我建议始终使用大括号{ } 打开一个关闭新代码块即使是一个衬里。只是为了重写你的一个门:

boolean AND(boolean A, boolean B) {
    if(A==true) {
        if(B==true) {
            return true;
        }
        //missing return here!
        //fix it by adding a return
        return false;
    } else {
        return false;
    }
}

【讨论】:

  • +1 对于这个建议,它可以挽救程序员的生命!
  • @TheNewIdiot 是的,在进行 Java 编程时强烈建议这样做。
  • -1 因为您编写的所有内容都与编码风格(这是个人偏好)有关,并且实际上与错误无关(尽管您在代码中对错误进行了注释)。如果你把它作为脚注,那就没问题了。
  • @Dukeling 实际上,这里的问题是编码风格。否则,不会有任何错误。通过阅读代码,您可以看到这是一个if-else 练习,旨在迷惑学生并教他们使用大括号的重要性。对于这种特定情况,编码风格很重要
  • 鉴于上面的 A == trueB == true 声明,我发现您的最后一条评论很难接受。即使是他们的原始代码。
【解决方案2】:

正如其他人所指出的,您确实错过了一些返回语句。这是您正在寻找的简短版本:

public class Logic {
    boolean AND(boolean A, boolean B) {
        return A && B;
    }
    boolean OR(boolean A, boolean B) {
        return A || B;
    }
    boolean NOT(boolean A) {
        return !A;
    }
    boolean NAND(boolean A, boolean B) {
        return !(A && B);
    }
    boolean NOR(boolean A, boolean B) {
        return !(A || B);
    }
    boolean XOR(boolean A, boolean B) {
        return A ^ B;
    }
    boolean XNOR(boolean A, boolean B) {
        return !(A ^ B);
    } 
}

请注意,Java 中的类名按照约定应以大写字母开头。

【讨论】:

  • 为什么不编写这些?你已经写过 NOT、OR、XOR 和 AND。您可以使用这些构建 XNOR、NOR 和 NAND。从技术上讲,您可以从 NAND 门构建一切。
  • 当然,您也可以将 XOR 组合为 OR(AND(A, NOT(B)), AND(B, NOT(A)))。我想我选择这个答案是出于效率原因(尽量减少昂贵的函数调用)。
【解决方案3】:

您缺少某些代码路径的返回语句。

OR 中,如果 A 为真,B 为假,会发生什么?

【讨论】:

    【解决方案4】:

    您的某些方法的路径没有返回值。

    例如:

    boolean NOR(boolean A, boolean B) {
                if(A==false) {
                    if(B==false)
                        return true;
                }
                else
                    return false;
            }
    

    如果 A == false 且 B == true,则没有要运行的 return 语句。这就是您收到编译器错误的原因。

    在你的所有 if 语句周围加上括号可能会更明显:

    boolean NOR(boolean A, boolean B) {
                if(A==false) 
                {
                    if(B==false)
                    {
                        return true;
                    }
                    //No return here
                }
                else
                {
                    return false;
                }
    
                //No return here
            }
    

    【讨论】:

    • 您的第二个“这里不返回”是错误的。没有回报很好,因为没有可以到达那里的分支。
    • @Dukeling 你什么意思?那里没有 return 语句,因此存在没有 return 语句的分支。如果 A == false,并且 B == true,它将到达那里。
    • @thatidiotguy 这里有一个隐含的空 else,如果内部 if 语句为 false 则不返回任何内容
    • @LuiggiMendoza whaaaaaat? else 与第一个 if 匹配!我疯了吗???他的内部 if 用括号括起来。
    • 我想从技术上讲,您需要要么第一个“//此处不返回”或第二个“//此处不返回”,但不能同时两个
    【解决方案5】:

    除了返回语句错误之外,您的代码也太复杂了。 Java 已经有复合逻辑运算符,可以大大简化您对程序的推理方式。

    // no need for A == true, A is either already true or false
    // just combine them using the && operator
    boolean AND(boolean A, boolean B) {
       return A && B;
    }
    

    同样适用于 OR:

    boolean OR(boolean A, boolean B) {
       return A || B;
    }
    

    您还可以从其他逻辑门构建逻辑门,EX NOT + OR == NOR

    boolean NOT(boolean A) {
       return !A;
    }
    
    boolean OR(boolean A, boolean B) {
       return A || B;
    }
    

    将两者结合起来创建 NOR:

    boolean NOR(boolean A, boolean B) {
       return NOT( OR(A, B) );
    }
    

    使用它,看看您是否可以自己编写其余部分。

    【讨论】:

    • @arshajii 首先不需要函数,但是因为它们正在被使用,所以这要简单得多。
    • 酷!首先,我对逻辑门知之甚少:P。 A || B 到底是做什么的?
    • @user2576988 这是你要写的或门,纯粹而简单
    • @user2576988 || 在 Java(和许多其他语言)中是计算逻辑 OR 的运算符,这正是您要建模的门。看看 Java 运算符列表:docs.oracle.com/javase/tutorial/java/nutsandbolts/…
    【解决方案6】:

    缺少返回语句错误意味着函数声明说它返回了一些东西,但至少存在一个不返回任何东西的流程。例如。在 And 的代码中 - 如果 A 为真且 B 为假。修改了代码:

    package logic;
    public class Logic {
    boolean AND(boolean A, boolean B) {
        if (A == true && B == true) {
            return true;
        }
        return false;
    }
    
    boolean OR(boolean A, boolean B) {
        if (A == false && B == false) {
            return false;
        }
        return true;
    }
    
    boolean NOT(boolean A) {
        if (A == true) {
            return false;
        }
        return true;
    }
    
    boolean NAND(boolean A, boolean B) {
        if (A == true && B == true) {
            return false;
        }
        return true;
    }
    
    boolean NOR(boolean A, boolean B) {
        if (A == false && B == false) {
            return true;
        }
        return false;
    }
    
    boolean XOR(boolean A, boolean B) {
        if (A == B) {
            return false;
        }
        return true;
    }
    
    boolean XNOR(boolean A, boolean B) {
        if (A == B) {
            return true;
        }
        return false;
    }
    

    }

    【讨论】:

      【解决方案7】:

      有些值可能导致不返回任何值,记住if 有一个空的else{},无论你是否给它,所以让我们看看你的函数之一

      boolean AND(boolean A, boolean B) {
          if(A==true) {
              if(B==true)
                  return true;
              }else{
                    //else made explicit by me
                    //NO RETURN
              }
          }
          else{
              return false;
          }
      }
      

      所以如果 A 为真但 B 为假 什么都不会返回,编译器不允许这样做

      使用 multiline-braceless-if 也是不明智的,因为它更容易出现此类错误。见http://cafe.elharo.com/blogroll/braceless-if-considered-harmful/

      【讨论】:

        【解决方案8】:

        对于所有可能的“路径”,您必须有一个 return 语句。例如

        boolean AND(boolean A, boolean B) {
                if(A==true) {
                    if(B==true)
                        return true;
                }
                else
                    return false;
            }
        

        等价于

        boolean AND(boolean A, boolean B) {
                if(A==true) {
                    if(B==true)
                        return true;
                    else
                        //something must be returned here
                }
                else
                    return false;
            }
        

        你也可以有一个返回null;在每个方法的末尾声明以避免此错误。

        【讨论】:

        • 值得补充的是,使用 multiline-braceless-if 被认为是不好的做法
        猜你喜欢
        • 2012-10-04
        • 2016-06-23
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        • 2020-09-15
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        相关资源
        最近更新 更多