14

これはコンパイルされず、次のエラーが発生します: Illegal start of expression. なんで?

public static AppConfig getInstance() {
    return mConfig != null ? mConfig : (throw new RuntimeException("error"));
}
4

4 に答える 4

17

ユーティリティメソッドを書くことができます

public class Util
{
  /** Always throws {@link RuntimeException} with the given message */
  public static <T> T throwException(String msg)
  {
      throw new RuntimeException(msg);
  }
}

そして、次のように使用します。

public static AppConfig getInstance() 
{
    return mConfig != null ? mConfig : Util.<AppConfig> throwException("error");
}
于 2013-01-06T13:45:36.860 に答える
14

これは、Java の三項演算子の形式expression ? expression : expressionが であり、最後の部分としてステートメントを指定しているためです。式は値を与えますが、ステートメントは値を与えないため、これは意味がありません。条件が false であることがわかり、2 番目の値を与えようとした場合、Java は何をするつもりですか? 値はありません。

三項演算子は、完全なステートメントを使用せずに 2 つの変数の間ですばやく選択できるように設計されてifいます。これは、実行しようとしていることではないため、使用しないでください。最善の解決策は次のとおりです。

public static AppConfig getInstance() {
    if (mConfig != null) {
        return mConfig;
    } else {
        throw new RuntimeException("error");
    }
}

三項演算子は、副作用を生成するようには設計されていません。副作用を生成するように作成することはできますが、それを読んでいる人はそれを期待しないので、if明確にするために実際のステートメントを使用する方がはるかに優れています。

于 2012-12-15T11:42:50.300 に答える
0

を返そうとしていthrow new RuntimeException("error")ます。そのため、エラーが発生しています。戻ってくる場合とtrue戻ってくるAppConfig場合に備えて。falseexception

于 2012-12-15T11:41:54.077 に答える