2011-09-07 9 views
0

내가 다음 코드를 실행할 때 일어나는 이상한 일이 번호를 할당 할 때 : NullPointerException이

private void doStuff(Long inLong) { 
    long theNumber = inLong; 

    /* ... */ 
} 

은 가끔 할당 줄에서 로그에 NullPointerException이보고 그런 일이 왜 이해할 수 없다. 어떤 생각?

+2

입력이 'null'일 수 없으면 'long'을 사용하십시오. – starblue

답변

1

in long은 아마도 null입니다. 그런 다음 null 참조를 할당하고 기본 유형으로 unbox를 시도합니다.

+0

그냥 내 컴퓨터에서 Long에 값 'null'이있는 Long을 할당하려고했습니다. 실제로 NullPointerException이 발생합니다. –

2

당신은 null을 전달했습니다. .의

theNumber = 0; // or Long.MIN_VALUE or Long.MAX_VALUE or whatever you prefer 
if (inLong != null) { 
    theNumber = inLong; 
} 
// ... 
1

inLong 때문에가 널 (NULL) 일 수있는 당신이 전달되는 것을 확인하고 자동으로 당신이 무엇을 원하는 것 같아요 0
에 매핑되지 않습니다 것은 이것이다 없는. Long 개체를 long 변수에 할당 할 때마다 Java는 자동으로 해당 변수를 적절한 유형으로 해제하려고 시도하지만 Long 변수 값이 null이면 실패합니다.

해당 할당 전에 null 체크를하면 오류가 제거되지만 예외를 발생 시키거나 null 인수를 적절히 처리해야 할 수 있습니다.

+1

고마워,하지만이 경우에는 0으로 매핑하는 것이 적절한 해결책이 될 것이라고 생각하지 않는다 ... –

+0

그 이유는 내가 생각하기에 : 나는 보통 'MIN_VALUE' 또는'NaN'을 유효하지 않은 숫자로 사용하지만 컨텍스트에 크게 의존합니다 . –

+0

MIN_VALUE 또는 MAX_VALUE는 0과 크게 다르지 않습니다. 대신에 매개 변수를 대신 사용하면됩니다 (내 대답 참조). NaN을 사용하는 것이 더 좋지만 다른 예외를 피하기 위해 완전히 다른 방식으로 null을 처리해야합니다. – DaveFar

0

가 inLong 매개 변수이기 때문에 :

2

long theNumber = inLong;의 경우 inLong.longValue()을 암시 적으로 호출하여 inLong의 long 값을 가져옵니다. 이를 자동 언 박싱이라고합니다 (때로는보다 일반적인 자동 권투). inLong이 null 일 경우 null에서 다른 메서드를 호출하는 것처럼 NullPointerException을 얻습니다. 당신이 정의되지 않은 값이 필요하지 않은 경우

, 당신은 발신자가 null 통과하지 있는지 확인해야하며,를 통해이 주장 :

따라서, 당신은 몇 가지 대안을 생각해야

private void doStuff(Long inLong) { 
    assert inLong != null; 
    long theNumber = inLong; 
    /* ... */ 
} 

(또는 사용 a Nonnull-Checker). 이 방법은 공개했다 당신은 널 (null)가 전달되지 않습니다 확신 할 수없는 경우, 오히려 수행

public void doStuff(Long inLong) { 
    if (inLong == null) { throw new IllegalArgumentException(); } 
    long theNumber = inLong; 
    /* ... */ 
} 

당신이 정의되지 않은 값을 필요로하지 않으며, 오히려 사용 모음의 값을 사용하여 (또는 다른 일반적인 매개 변수에) 둘 경우 대신 방법 private void doStuff(long inLong). Long 객체가 필요한 경우에도 물론 long 유형의 매개 변수를 사용하고 doStuff 내부의 (자동) 복싱을 수행하여 Long 객체를 가져올 수 있습니다. 당신이 정의되지 않은 값을 필요로 할 경우

, 당신은 그것을 확인하고 필요한 것을 수행해야합니다,

private void doStuff(Long inLong) { 
    if (inLong == null) { 
    handleUndef(); 
    } else { 
    long theNumber = inLong; 
    /* ... */ 
    } 
} 

그냥 좀 더 정교한 handleUndef() 내 생각에 반신 반의 대신 값을 0으로 설정 당신 때문에 처음에는 long 타입의 매개 변수를 사용할 수있었습니다 (위 참조).

0

inLong이 null 인 경우 NPE가 예상되는 동작입니다.

long theNumber = inLong; 

은 NPE의 원인이 분명해야한다

long theNumber = inLong.longValue(); 

의미 상 동일합니다.

관련 문제