삼항 if-else의 자동 언 박싱 요구


23

이 코드는 잘 작동합니다 :-

    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");

왜 그렇게 되었습니까?

답변:


22

삼항 조건식의 유형

1 <= 3 ? nullInt : -1

입니다 int(JLS에는 2 차 및 3 차 피연산자의 유형에 따라 3 항 조건 연산자의 유형을 설명하는 여러 테이블이 포함되어 있습니다).

이 언 박스에 시도 할 때 따라서, nullIntint, a는 NullPointerException발생합니다.

if-else 스 니펫의 동작을 얻으려면 다음과 같이 작성해야합니다.

1 <= 3 ? nullInt : Integer.valueOf(-1)

이제 표현식의 유형은 Integer이므로 unboxing은 발생하지 않습니다.


4
그냥 당신의 대답에 추가, 여기 언급 된 표는 다음과 같습니다 docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25
Amongalen

3

삼항 연산자에 대한 인수는 동일한 유형이어야합니다. -1을 사용하고 일부 상수 nullint컴파일러는 nullint값을 얻기 위해 개봉 을 시도 합니다. 그런 다음 자동 저장하여 secondNull변수 에 저장 하십시오.


3

이는 조건부 연산자에 대한 두 피연산자 ? :가 기본 유형 및 상자 참조 유형 인 경우, 언 박싱 변환이 수행되기 때문입니다 ( JLS §15.25.2 ).

숫자 조건식의 유형은 다음과 같이 결정됩니다.

  • ...
  • 두 번째 및 세 번째 피연산자 중 하나가 기본 유형 T이고 다른 유형이 복싱 변환 (§5.1.7)을 T에 적용한 결과 인 경우 조건식의 유형은 T입니다.

일반적으로, 표현식 자체를 컴파일 타임 유형으로 가져야 하기 때문에 if명령문을 ? :표현식으로 바꾸는 것이 항상 코드의 의미를 보존하지는 않습니다 ? :. 즉, 두 피연산자의 유형이 다른 경우 결과가 일관된 컴파일 타임 유형을 갖도록 변환을 하나 또는 둘 다로 수행해야합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.