38

一般に、Java コンパイラは、メソッドが「常に」例外をスローするという情報を伝達しないため、すべてのコード パスが完全であることを検出しません。

(これは、Java コンパイラが各クラスを個別にコンパイルするためです)。

みたいなことを書きたいときは問題です。

public class ErrorContext {
    public void fatalISE(String message) {
        String context = "gather lots of information about the context of the error";
        throw new IllegalStateException(context +": " + message);
    }
}

public class A {
    public MyObject myMethod() {
        if (allIsGood()) {
            return new MyObject();
        }
        ErrorContext.fatalISE("all is not good");
    }
}

(つまり、コンテキスト情報を収集する一種の「アサーション ヘルパー」)。

コンパイラは、myMethod が常に MyObject を返すとは限らないと不平を言うからです。

私の知る限り、メソッドが常にスローすることを示す特定の注釈はありません。

4

6 に答える 6

47

簡単な回避策は、fatalISEメソッドが例外をスローせず、例外を作成することだけです。

public class ErrorContext {
    public IllegalStateException fatalISE(String message) {
        String context = "gather lots of information about the context of the error";
        return new IllegalStateException(context +": " + message);
    }
}

public class A {
    public MyObject myMethod() {
        if (allIsGood()) {
            return new MyObject();
        }
        throw ErrorContext.fatalISE("all is not good");
    }
}

このようにして、コンパイラは、欠落しているreturn. throwまた、コンパイラが通常文句を言うため、を使用するのを忘れることはまずありません。

于 2013-02-22T08:18:51.260 に答える
10

私が使用するトリックは、交換することです

public void fatalISE(String message) {
    String context = "gather lots of information about the context of the error";
    throw new IllegalStateException(context +": " + message);
}

public <T> T fatalISE(String message) {
    String context = "gather lots of information about the context of the error";
    throw new IllegalStateException(context +": " + message);
}

次に、myMethod で次を使用します。

public MyObject myMethod() {
   if (allIsGood()) {
        return new MyObject();
    }
    return ErrorContext.fatalISE("all is not good");
}

プリミティブ型を含め、myMethod の戻り値の型に関係なく機能します。キーワードfatalISEを使用しないだけで、void メソッドで引き続き使用できます。return

于 2013-02-22T08:15:52.537 に答える
8

if条件を逆にするのはどうですか?

public MyObject myMethod() {
    if (!allIsGood()) {
        ErrorContext.fatalISE("all is not good");
    }
    return new MyObject();
}

幸運を!

于 2013-02-22T08:24:19.617 に答える
6

追加

return null;

最後に。(とにかくそこに到達することはありませんが、コンパイラをサイレントにするためにこれを行う必要があります)

于 2013-02-22T08:19:12.553 に答える