Java 缺少返回站

Java 缺少返回站,java,if-statement,return,Java,If Statement,Return,我用Java编写了这个小程序作为练习,它模拟了7个电气逻辑门,我目前正在学习它。但当我试图编译它时,它会给我几个错误,指出缺少RETURN语句,但只适用于包含2个if语句和、OR、NAND和NOR的子例程。我想知道Java if语句是否有我不知道的地方。我还想知道在Java中是否有一种方法可以像在C中那样执行ifX&&Y。总之,下面是代码: package logic; public class logic { boolean AND(boolean A, boolean B) {

我用Java编写了这个小程序作为练习,它模拟了7个电气逻辑门,我目前正在学习它。但当我试图编译它时,它会给我几个错误,指出缺少RETURN语句,但只适用于包含2个if语句和、OR、NAND和NOR的子例程。我想知道Java if语句是否有我不知道的地方。我还想知道在Java中是否有一种方法可以像在C中那样执行ifX&&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  
所有的帮助或建议都被接受


由于某种原因,在我尝试使用ifA==true&&B==true之前,它不起作用,但现在它起作用了。

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

例如:

boolean NOR(boolean A, boolean B) {
            if(A==false) {
                if(B==false)
                    return true;
            }
            else
                return false;
        }
如果A==false和B==true,则没有要运行的返回语句。这就是为什么会出现编译器错误

如果在所有if语句周围加上括号,这一点可能会更加明显:

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

            //No return here
        }

Java不像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;
    }
}

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


在OR中,如果A为true,B为false会发生什么情况?

存在可能导致不返回任何值的值,请记住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为true,而B为false,则不会返回任何内容,编译器将不允许这样做


使用多行无括号if也是不明智的,因为它更容易产生此类错误。请参见

对于所有可能的路径,必须有一个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;
    }

您还可以返回空值;在每个方法的末尾添加语句以避免此错误。

除了返回语句错误之外,您的代码太复杂了。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;
}
类似地用于或:

boolean OR(boolean A, boolean B) {
   return A || B;
}
您还可以从其他逻辑门构建逻辑门,例如NOT+或==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) );
}

用这个,看看你是否能自己创作剩下的

Missing return语句错误意味着函数声明说它返回了一些东西,但至少存在一个流,它不返回任何东西。在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;
}

}

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

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中的类名应该以大写字母开头。

对于AND,返回a&&B,对于OR,返回a | | B等,或者完全忽略函数?a==true是多余的,可以简化为a。@Dukeling这是一个有趣的问题however@RichardTingle请不。我会强迫性地删除==true或==false,显然会替换为!。。。无论我在任何代码中看到它在哪里。@RichardTingle if John.isHuman==true在words中-if John is human是true。我不知道你的情况,但那不是我说话的方式,因此也不是我编码的方式。尽管你有一个观点!有些东西,虽然它只适用于不熟悉这种语法的程序员,但您已经习惯了阅读!够快了,你的第二次不归路是错误的。“没有回报是好的,因为没有分支机构可以到达那里。@Dukeling,你是什么意思?”?那里没有return语句,因此有些分支没有return语句。如果A==false,B==true,它将到达那里。@thattidotguy这里有一个隐式的空else,如果内部If语句为false@LuiggiMendoza什么?else与第一个if匹配!我疯了吗???他的内部if用括号括起来。我想从技术上讲,你要么需要第一个//此处不返回,要么需要第二个//此处不返回,但不能同时使用+1。对于这个建议,它可以挽救程序员的生命@是的,这是在进行Java编程时强烈建议的。-1因为您编写的所有内容都与编码风格有关,这是个人偏好,实际上与错误无关,尽管您在代码中对错误有注释。如果你把它做成脚注,那就好了。@Dukeling事实上,这里的问题是编码风格。否则,就不会有任何错误。通过阅读代码,您可以看到这是一个if-else练习,旨在迷惑学生并教他们使用大括号的重要性。对于这个特定的例子,编码风格很重要。我发现你最后的评论很难接受,因为上面的A==true和B==true语句。即使这是他们的原始代码。@arshajii一开始就不需要函数,但由于使用了它们,这就简单多了。酷!我不知道
首先,关于逻辑门的内容就这么多了:P.A | | B到底做什么?@user2576988这是你试图编写的或门,纯的和纯的simple@user2576988| |在Java和许多其他语言中,是计算逻辑OR的运算符,这正是您试图建模的门。看看Java操作符列表:值得一提的是,如果认为使用多行无括号是不好的做法,那么为什么不编写这些呢?您已经编写了NOT、OR、XOR和and。您可以从中构建XNOR、NOR和NAND。从技术上讲,你可以从一个与非门构建任何东西。当然,你也可以把XOR写成ORANDA,NOTB,ANDB,NOTA。我想我之所以选择这个答案,是因为效率的原因,可以最大限度地减少昂贵的函数调用。