0

私は現在それを学んでいるので、この小さなプログラムを Java の練習として書きました (7 つの電気的論理ゲートをシミュレートします)。しかし、コンパイルしようとすると、いくつかのエラーが"MISSING RETURN STATEMENT"表示されますが、2 つの if ステートメント (AND、OR、NAND、および NOR) を持つサブルーチンに対してのみです。Java の if 文についてわからないことがあるのではないかと思っています。CのようにJavaで行う方法があるかどうかも疑問に思っています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)動かなかったのですが、今は使えるようになりました。

4

8 に答える 8

3

Java は、コード ブロックが単純なインデントで記述されていることをコンパイラが理解する Python とは異なります。1 つの liner であっても、常にブレース{ }を使用して新しいコード ブロックを閉じることをお勧めします。ゲートの1つを書き直すだけです:

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

他の人が指摘したように、実際にはいくつかの return ステートメントを見逃しています。探している短いバージョンは次のとおりです。

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

一部のコード パスの return ステートメントがありません。

OR、A が true で B が false の場合はどうなりますか?

于 2013-07-12T16:08:25.037 に答える
0

値が返されない可能性のある値があります。指定したかどうかにかかわらず、ifは空であることを覚えておいてください。そのため、関数の 1 つを見てみましょう。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 の場合、も返されず、コンパイラはこれを許可できません。

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 に答える