2017-01-17 3 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입니다. 조건부 연산자의 두 번째 피연산자는 동일한 유형이어야하지만 float (결과는 Float.parseFloat)이고 Float (def)입니다. 컴파일러는 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; 
    } 
} 

을 ... 물론.

두 번째 피연산자의 유형이 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 '연산자를 사용하는 것이 좋습니다. 네, 몇 줄의 코드를 추가 할 수 있습니다. 그러나 파싱하고 즉시 자본 플로트 (float)로 다시 캐스팅하는 것이 "내가 도대체 ​​뭘하고 있었는지 ..."라고 생각하게 만드는 반면에, 일어나는 일을 이해하는 것이 더 쉬울 것입니다. 몇 개월 후 ... :) - 그럼'valueOf'는 물론 가장 쉬운 방법입니다 ... Duh! – Quota

관련 문제