2017-01-17 4 views
10

このプログラムは、nullでtoFloatを呼び出すときにnullを回避することになっていました。 私はまだそれは非常に微妙です。..任意のヘルプnullを返そうとしたときのNPE

System.out.println(toFloat(null, null));

private static Float toFloat(Float def, String str) { 
    try { 
     return str != null ? Float.parseFloat(str) : def; 
    } catch (NumberFormatException e) { 
     return def; 
    } 
} 

答えて

14

をNPEを取得しています。 Float.parseFloatfloatで、Floatではありません。条件付き演算子の2番目の2つのオペランドは同じ型でなければなりませんが、float(結果はFloat.parseFloat)とFloatdef)となります。コンパイラは、Floatを自動アンボックスによってfloatに強制することができるため、floatを選択します。

ですから、この書いたかのように、コンパイラの出力が何であるか:nullfloatValueがNPEをスロー呼び出して、

private static Float toFloat(Float def, String str) { 
    try { 
     return str != null ? Float.parseFloat(str) : def.floatValue(); 
     // Note ----------------------------------------^^^^^^^^^^^^^ 
    } catch (NumberFormatException e) { 
     return def; 
    } 
} 

を...そして、もちろん。

第2オペランドのタイプがFloatで、floatでないことを確認して修正できます。それを行うための方法の多くが、Zefick points outとして、最も簡単なのFloat.valueOf(String)です:

private static Float toFloat(Float def, String str) { 
    try { 
     return str != null ? Float.valueOf(str) : def; 
    } catch (NumberFormatException e) { 
     return def; 
    } 
} 
+2

Float.valueOf(STR) – Zefick

+0

@Zefick:いやはや!確かに... –

+2

わかりやすくするために私の提案は '? '演算子を取り除き、単純な' if'を使うことです。はい、コードの行数が増えます。しかし、何が起こっているのかを理解するのも簡単ですが、解析してすぐに資本のフロートにキャストすると、私は「何とか私が当時何をしていたのか」と思うでしょう。まあ 'valueOf'はもちろんもっとも簡単な方法です... Duh! – Quota

関連する問題