내가 다음 코드를 실행할 때 일어나는 이상한 일이 번호를 할당 할 때 : NullPointerException이
private void doStuff(Long inLong) {
long theNumber = inLong;
/* ... */
}
은 가끔 할당 줄에서 로그에 NullPointerException이보고 그런 일이 왜 이해할 수 없다. 어떤 생각?
내가 다음 코드를 실행할 때 일어나는 이상한 일이 번호를 할당 할 때 : NullPointerException이
private void doStuff(Long inLong) {
long theNumber = inLong;
/* ... */
}
은 가끔 할당 줄에서 로그에 NullPointerException이보고 그런 일이 왜 이해할 수 없다. 어떤 생각?
in long은 아마도 null
입니다. 그런 다음 null
참조를 할당하고 기본 유형으로 unbox를 시도합니다.
그냥 내 컴퓨터에서 Long에 값 'null'이있는 Long을 할당하려고했습니다. 실제로 NullPointerException이 발생합니다. –
당신은 null을 전달했습니다. .의
theNumber = 0; // or Long.MIN_VALUE or Long.MAX_VALUE or whatever you prefer
if (inLong != null) {
theNumber = inLong;
}
// ...
inLong
때문에가 널 (NULL) 일 수있는 당신이 전달되는 것을 확인하고 자동으로 당신이 무엇을 원하는 것 같아요 0
에 매핑되지 않습니다 것은 이것이다 없는. Long
개체를 long
변수에 할당 할 때마다 Java는 자동으로 해당 변수를 적절한 유형으로 해제하려고 시도하지만 Long 변수 값이 null이면 실패합니다.
해당 할당 전에 null 체크를하면 오류가 제거되지만 예외를 발생 시키거나 null 인수를 적절히 처리해야 할 수 있습니다.
고마워,하지만이 경우에는 0으로 매핑하는 것이 적절한 해결책이 될 것이라고 생각하지 않는다 ... –
그 이유는 내가 생각하기에 : 나는 보통 'MIN_VALUE' 또는'NaN'을 유효하지 않은 숫자로 사용하지만 컨텍스트에 크게 의존합니다 . –
MIN_VALUE 또는 MAX_VALUE는 0과 크게 다르지 않습니다. 대신에 매개 변수를 대신 사용하면됩니다 (내 대답 참조). NaN을 사용하는 것이 더 좋지만 다른 예외를 피하기 위해 완전히 다른 방식으로 null을 처리해야합니다. – DaveFar
가 inLong 매개 변수이기 때문에 :
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 타입의 매개 변수를 사용할 수있었습니다 (위 참조).
inLong이 null 인 경우 NPE가 예상되는 동작입니다.
long theNumber = inLong;
은 NPE의 원인이 분명해야한다
long theNumber = inLong.longValue();
의미 상 동일합니다.
입력이 'null'일 수 없으면 'long'을 사용하십시오. – starblue