그것은 매우 미묘 .. NPE를 얻고있다. Float.parseFloat
은 float
이 아니라 Float
입니다. 조건부 연산자의 두 번째 피연산자는 동일한 유형이어야하지만 float
(결과는 Float.parseFloat
)이고 Float
(def
)입니다. 컴파일러는 Float
을 자동 언 박싱을 통해 float
으로 강제 변환 할 수 있기 때문에 float
을 선택합니다.
그래서 당신이 작성했던 것처럼 컴파일러 출력이 무엇 : null
에 floatValue
가 NPE가 발생합니다 호출,
private static Float toFloat(Float def, String str) {
try {
return str != null ? Float.parseFloat(str) : def.floatValue();
// Note ----------------------------------------^^^^^^^^^^^^^
} catch (NumberFormatException e) {
return def;
}
}
을 ... 물론.
두 번째 피연산자의 유형이 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;
}
}
Float.valueOf (STR) – Zefick
@Zefick : 도현! 참으로 ... –
명확하게하기 위해'? '연산자를 없애고 간단한'if '연산자를 사용하는 것이 좋습니다. 네, 몇 줄의 코드를 추가 할 수 있습니다. 그러나 파싱하고 즉시 자본 플로트 (float)로 다시 캐스팅하는 것이 "내가 도대체 뭘하고 있었는지 ..."라고 생각하게 만드는 반면에, 일어나는 일을 이해하는 것이 더 쉬울 것입니다. 몇 개월 후 ... :) - 그럼'valueOf'는 물론 가장 쉬운 방법입니다 ... Duh! – Quota