이 코드는 잘 작동합니다 :-
Integer nullInt = null;
if (1 <= 3) {
Integer secondNull = nullInt;
} else {
Integer secondNull = -1;
}
System.out.println("done");
그러나 이것은 null 포인터 예외를 발생시키는 반면 Eclipse는 자동 unboxing이 필요하다는 경고를 표시합니다.
Integer nullInt = null;
Integer secondNull = 1 <= 3 ? nullInt : -1;
System.out.println("done");
왜 그렇게 되었습니까?
답변
삼항 조건식의 유형
1 <= 3 ? nullInt : -1
입니다 int
(JLS에는 2 차 및 3 차 피연산자의 유형에 따라 3 항 조건 연산자의 유형을 설명하는 여러 테이블이 포함되어 있습니다).
이 언 박스에 시도 할 때 따라서, nullInt
에 int
, a는 NullPointerException
발생합니다.
if-else 스 니펫의 동작을 얻으려면 다음과 같이 작성해야합니다.
1 <= 3 ? nullInt : Integer.valueOf(-1)
이제 표현식의 유형은 Integer
이므로 unboxing은 발생하지 않습니다.
답변
삼항 연산자에 대한 인수는 동일한 유형이어야합니다. -1을 사용하고 일부 상수 nullint
컴파일러는 nullint
값을 얻기 위해 개봉 을 시도 합니다. 그런 다음 자동 저장하여 secondNull
변수 에 저장 하십시오.
답변
이는 조건부 연산자에 대한 두 피연산자 ? :
가 기본 유형 및 상자 참조 유형 인 경우, 언 박싱 변환이 수행되기 때문입니다 ( JLS §15.25.2 ).
숫자 조건식의 유형은 다음과 같이 결정됩니다.
- …
- 두 번째 및 세 번째 피연산자 중 하나가 기본 유형 T이고 다른 유형이 복싱 변환 (§5.1.7)을 T에 적용한 결과 인 경우 조건식의 유형은 T입니다.
일반적으로, 표현식 자체를 컴파일 타임 유형으로 가져야 하기 때문에 if
명령문을 ? :
표현식으로 바꾸는 것이 항상 코드의 의미를 보존하지는 않습니다 ? :
. 즉, 두 피연산자의 유형이 다른 경우 결과가 일관된 컴파일 타임 유형을 갖도록 변환을 하나 또는 둘 다로 수행해야합니다.
답변
이것은 (Java 1.8에서) 작동했습니다.
Integer secondNull = 1 <= 3 ? null : -1;