2013-01-25 2 views
4

아래의 코드에 어떤 문제가 있습니까? 실행 시간 동안 NullPointerException이 발생합니다.내 코드에 어떤 문제가 있습니까? NullPointerException

public class Test 
{ 
    public String method1() 
    { 
    return null; 
    } 
    public Integer method2() 
    { 
    return null; 
    } 
    public static void main(String args[])throws Exception 
    { 
    Test m1 = new Test(); 
    Integer v1 = (m1.method1() == null) ? m1.method2() : Integer.parseInt(m1.method1()); 
    } 
} 
+0

Integer.parseInt (m1.method1());) - 오류 –

+8

MyTest 란 무엇입니까? –

+0

@AndrewThompson hah :) –

답변

1

parseInt는 int를 반환합니다. 즉 m1.method2()를 언 박싱 컴파일러하게 발생하지만 그래서 널 :

Integer v1 = (m1.method1() == null) ? m1.method2() : (Integer)Integer.parseInt(m1.method1()); 
9

a ? b : c 유형 마지막 c 값의 종류이다. 이 경우는 int입니다. 즉, b이 선택 되더라도 Unbox 된 다음 Integer로 다시 상자됩니다. 값이 null이기 때문에 실패합니다. 여기

도움 (이상 혼란)

Integer i = 1000; 

// same as Integer j = Integer.valueOf(i == 1000 ? i.intValue() : 1000); 
Integer j = i == 1000 ? i : 1000; 
System.out.println(i == j); 

Integer k = i == 1000 ? i : (Integer) 1000; 
System.out.println(i == k); 

인쇄

false 
true 

첫번째 결과가 거짓 이유있다 유사한 예는, 식 int의 유형 (한다는 것이다 마지막 인수는 iint으로 언 박싱되고 재 지정되어 Integer에 할당 될 수 있음을 의미합니다. 이것은 다른 오브젝트를 생성합니다 (캐시 크기를 늘리고이를 변경하는 명령 행 인수가 있습니다). 두 번째 예에서는 유형이 Integer이므로 unboxed가 아니며 오브젝트가 동일합니다.

+1

좋은 대답입니다. 나는 몰랐다. '이것은 b가 선택 되더라도 상자가 풀리고 정수로 다시 채워진다는 것을 의미한다. 결코 배우지 않는다! – ThanksForAllTheFish

+0

+ 1 좋은 설명 –

+1

@mardavi 상자가 없으며 리 박스 된 것을 보여주는 예제를 추가했습니다 –

관련 문제