Pregunta

  

Duplicados posibles:
   booleanos, operadores condicionales y autoboxing
   Java, Google colecciones de la biblioteca; AbstractIterator problema?

El código siguiente produce un NPE:

Integer test = null;
Integer test2 = true ? test : 0;
System.out.println(test2);

Para imprimir correctamente "nulo" sin excepción requiere este código:

Integer test = null;
Integer test2 = true ? test : (Integer)0;
System.out.println(test2);

Es obvio que en el primer ejemplo de que "prueba" se sacó de la caja (se convierte a int nativo), pero ¿por qué? Y por qué no cambiar la otra expresión en el operador ternario (como en el segundo ejemplo) solucionarlo? ¿Alguien puede ofrecer algún tipo de narrativa de exactamente cuándo, qué y por qué cosas en los dos ejemplos se sacó de la caja y caja?

¿Fue útil?

Solución

sección 15.25 de la especificación del lenguaje Java :

  

El tipo de una expresión condicional se determina como sigue:

     
      
  • Si el segundo y tercer operandos tienen el mismo tipo (que puede ser del tipo null), a continuación, que es el tipo de la expresión condicional.      
        
    • Si uno de los segundo y tercer operandos es de tipo booleano y el tipo de la otra es de tipo booleano, entonces el tipo de la expresión condicional es booleano.
    •   
    • Si uno de los segundo y tercer operandos es del tipo nulo y el tipo de la otra es un tipo de referencia, entonces el tipo de la expresión condicional es que tipo de referencia.
    •   
    • lo contrario, si el segundo y tercer operandos tienen tipos que son convertible (§5.1.8) para tipos numéricos, a continuación, hay varios casos:      
          
      • Si uno de los operandos es de tipo byte o byte y el otro es de tipo corto o corto, entonces el tipo de la expresión condicional es corto.
      •   
      • Si uno de los operandos es de tipo T, donde T es byte, short, o char, y el otro operando es una expresión constante de tipo int cuyo valor es representable en el tipo T, entonces el tipo de la expresión condicional es T .
      •   
      • Si uno de los operandos es de tipo Byte y el otro operando es una expresión constante de tipo int cuyo valor es representable en el byte de tipo, entonces el tipo de la expresión condicional es byte.
      •   
      • Si uno de los operandos es de tipo corto y el otro operando es una expresión constante de tipo int cuyo valor es representable en el tipo corto, entonces el tipo de la expresión condicional es corto.
      •   
      • Si uno de los operandos es de tipo; Carácter y el otro operando es una expresión constante de tipo int cuyo valor es representable en el tipo char, entonces el tipo de la expresión condicional es CHAR.
      •   
      • Si no, promoción numérica binaria (§5.6.2) se aplica a los tipos de operando, y el tipo de la expresión condicional es el tipo promovido de la segunda y tercera operandos. Tenga en cuenta que tipo numérico binario lleva a cabo la promoción de conversión unboxing (§5.1.8) y la conversión de juegos de valor (§5.1.13).
      •   
    •   
  •   

Por lo que es después de la última bala, realizando promoción numérica binaria, que realiza una conversión unboxing. Por lo que el tipo de la expresión operador condicional es int, a pesar de que usted está asignando a un Integer. Se trata de intentar realizar la conversión unboxing en null, por lo tanto, la excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top