2013-04-26 2 views
15

これは私が思うJavaの純粋主義者のためのものです。私は最近、ブール値へのString値のカスタム解析を実行するメソッドに問題がありました。シンプルな十分な仕事が、何らかの理由で方法以下がnullの場合にNullPointerExceptionが投げていたが...方法についてブール値からのNullPointerException

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

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

は最終的に私はあきらめ、次のようにメソッドを書き直し、期待通りに動作している:

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; 
} 
+2

+1いいニースの "パズル" – NilsH

+0

@NilsH +1とその解決のおかげで! – Robin

答えて

13

また、これは動作します:

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

ですから、NPEは三項演算子で booleanを使用すると、式の結果が booleanとして処理されますので、オートボクシングが原因になってしまう理由。 nullのボクシングを解除すると、NPEが発生します。

+1

+1よくできました。ある原作者がコードを見ているとは思わない。 –

+0

良い答え@Nils - 滑りやすい小さな悪魔その1!私は 'ブール'定数の使用を考えていませんでした。 – Robin

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オブジェクトを参照するあなたを防ぐことができますのようなアプローチを採用。

元のメソッドが例外をスローしている理由を確認するには、excellent answer from NilsHを参照してください。

+1

私は同意します。後でNPEに入るよりも速く失敗する方が良いです。ブール値は、「トライステート」ソリューションが必要な場合に使用されます。 – NilsH

+0

これはトライステートなので、私は実際に期待値の例外を投げてはいけません! また、とにかく高価なハンドリングは例外ではありませんか? – Robin

2

興味深い回答がありませんなぜこれが最初に起こりますか?

これは三項式と関係があります。

コンパイラは、nullへのヌル参照をブール値として解釈し、ブール値(nullの場合)にオートボクシング/アンボクシング規則を適用して実行時にNullPointerExceptionを取得します。

+2

あなたは答えを再読しなければならないと思う; – NilsH

+1

おそらく書いている時点で@NilsHあなたのこの部分を逃した。 :)私から+ 1。 – Eugene

関連する問題