17

これは、Java 純粋主義者向けだと思います。最近、文字列値からブール値へのカスタム解析を実行する方法に問題がありました。単純なタスクですが、何らかの理由で、以下のメソッドが null の場合に NullPointerException をスローしていました...

static Boolean parseBoolean(String s)
{
    return ("1".equals(s) ? true : ("0".equals(s) ? false : null));
}

メソッドの戻り値の型はブール値ですが、なぜ、またはどのように NullPointerException がスローされるのでしょうか? デバッグから、ネストされたインライン条件文がnullに評価され、外側のインライン条件文にnullを返すポイントで例外がスローされているようですが、理由は説明できません。

最終的に私はあきらめて、次のようにメソッドを書き直しました。これは期待どおりに機能します。

static Boolean parseBoolean(String s)
{
    if ("1".equals(s)) return true;
    if ("0".equals(s)) return false;

    return null;
}

次のコードは 2 つの中間であり、期待どおりに動作します。

static Boolean parseBoolean(String s)
{
    if ("1".equals(s)) return true;

    return "0".equals(s) ? false : null;
}
4

3 に答える 3

13

これも機能します:

static Boolean parseBoolean(String s)
{
    return ("1".equals(s) ? Boolean.TRUE : ("0".equals(s) ? Boolean.FALSE : null));
}

したがって、NPE が発生する理由は、オートボクシングが原因です。これはboolean、三項演算子で を使用すると、式の結果が として扱われるためbooleanです。またnull、開封すると NPE が発生します。

于 2013-04-26T09:55:21.617 に答える
8

私のおすすめ?を返さないで、例外Booleanを返しbooleanてスローします。

static boolean parseBoolean(String s)
{
  if ("1".equals(s)) return true;
  if ("0".equals(s)) return false;

  throw new IllegalArgumentException(s + " is not a boolean value.");
}

Boolean上記のようなアプローチを採用すると、nullオブジェクトを誤って参照することを避けることができます。

元のメソッドが例外をスローしている理由を確認するには、NilsHからの優れた回答を参照してください。

于 2013-04-26T09:52:00.437 に答える