0

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

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)它之前它不起作用,但现在它是。

4

8 回答 8

3

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

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;
    }
}
于 2013-07-12T16:08:05.260 回答
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 中的类名按照约定应以大写字母开头。

于 2013-07-12T16:18:52.080 回答
1

您的某些方法的路径不会导致返回值。

例如:

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
        }
于 2013-07-12T16:08:03.643 回答
1

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

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

于 2013-07-12T16:08:25.037 回答
1

除了返回语句错误之外,您还使代码过于复杂。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) );
}

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

于 2013-07-12T16:14:08.303 回答
0

有一些可能的值可能导致没有值被返回,记住无论你是否给它一个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/

于 2013-07-12T16:08:35.997 回答
0

对于所有可能的“路径”,您必须有一个 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;在每个方法的末尾声明以避免此错误。

于 2013-07-12T16:10:08.643 回答
0

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

}

于 2013-07-12T16:16:35.553 回答