12

重複の可能性:
Java でオブジェクトを参照しない場合、次のように何が起こるか: myString.concat(“that”)

public class ReturnTest
{
    public static void main(String[] args)
    {
        ReturnTest rt = new ReturnTest();
        rt.show();
    }

    public String show()
    {
        return "Hello";
    }
}

上記のコードでは、show()メソッドはStringどの変数にもキャプチャされない値を返します。コンパイラも JVM も警告、エラー、または例外を発生させません。プリミティブな戻り値の型についても同じことが言えます。なんで?

コンパイラは、メソッドによって返される重要な値がこれによって失われないようにするべきではありませんか?

シェルからこれを修正するにはどうすればよいですか??

4

4 に答える 4

12

これが言語の設計です。

多くの場合、メソッドは気にしない値を返します。たとえばStringBuilder.append()、オブジェクト自体を返します。

場合によっては、重要な戻り値が失われる可能性があることは事実です。たとえば、InputStream.skip(long n)スキップされたバイト数を返します。読み取っreadたバイト数を返します。このようなバグを検出するツール ( CheckstyleFindBugs )がいくつかあります。しかし、言語自体は戻り値のチェックを要求しません。たとえそうであったとしても、プログラムはその値を無視することを選択できます。

于 2012-05-28T10:11:13.730 に答える
5

必ずしも戻り値が必要なわけではないためです。

于 2012-05-28T10:10:09.237 に答える
4

@CheckReturnValue戻り値を常に使用する必要がある場合は、メソッドにアノテーションを付けることができます。FindBugs のような静的コード分析では、このアノテーションが考慮され、違反すると警告が発生します。

少なくとも、呼び出し元が責任を負う最終処理が必要な何らかのオブジェクトをメソッドが返す場合、これは非常に合理的です。これは、最後に閉じる必要があるリソースに当てはまります。最後に解放しなければならないロック...

于 2012-05-28T10:12:30.713 に答える
1

Java 関数は純粋ではないため、副作用のためにのみ実行される場合があります。この場合、副作用はありません...

public String show() {
    System.out.println("Hello");
    return "Hello";
}

今、あなたは警告が欲しいですか?コンパイラは、副作用のために実行していたのか、値のために実行していたのかを知ることができません。

于 2012-05-28T10:12:27.503 に答える