solucion - ¿Por qué el compilador de Java a veces permite el desempaquetado de null?
optional java ejemplo (3)
El boxeo oculta parcialmente la distinción entre primitivas y objetos de envoltura correspondientes, pero no la elimina.
Hay dos distinciones que no se cambian por el boxeo:
- los objetos pueden ser nulos, mientras que los primitivos no pueden
- los objetos tienen estado e identidad, mientras que los primitivos solo tienen estado (el valor)
Ocasionalmente, estas diferencias pueden causar problemas cuando se usa el boxeo.
Algunos puntos para recordar:
- ten cuidado con los nulos Desenmarcar automáticamente un objeto nulo provocará una
NullPointerException
. - la comparación de elementos con
==
yequals
debe hacerse con cuidado.
Por ejemplo:
int anInt = null;
falla en tiempo de compilación pero
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("" + getSomeVal());
}
}
public static int getSomeVal() {
return new Random().nextBoolean() ? 1 : null;
}
falla (generalmente) en tiempo de ejecución. Tratar de devolver solo el null
también dará como resultado un error de compilación, por lo que asumo que hay algo acerca de tener varias rutas que hacen que el compilador deduzca que null
es potencialmente una int
intemperie. ¿Por qué javac no puede fallar en compilar ambos casos con el mismo error?
En el primer caso, el compilador sabe que está intentando desempaquetar una constante de compilación null
.
En el segundo caso, el tipo de expresión condicional es Integer
, por lo que efectivamente está escribiendo:
Integer tmp = new Random().nextBoolean() ? 1 : null;
return (int) tmp;
... así que el desempaquetado no está ocurriendo en una expresión constante, y el compilador lo permitirá.
Si lo cambiaste para forzar que la expresión condicional sea de tipo int
al desempaquetar allí , fallaría:
// Compile-time failure
return new Random().nextBoolean() ? 1 : (int) null;
No se puede asignar nulo a un int.
int anInt = null;
Java permite esto ya que no está asignando null a un int.
System.out.println("" + getSomeVal()); //null was just converted to a srting and was printed
Si realiza esto, puede obtener el error.
int anInt = getSomeVal();