String x = (String) null;
¿Por qué no hay excepción en esta declaración?
String x = null;
System.out.println(x);
Se imprime null
. Pero el .toString()
método debería arrojar una excepción de puntero nulo.
String x = (String) null;
¿Por qué no hay excepción en esta declaración?
String x = null;
System.out.println(x);
Se imprime null
. Pero el .toString()
método debería arrojar una excepción de puntero nulo.
Respuestas:
Puede emitir
null
a cualquier tipo de referencia sin obtener ninguna excepción.El
println
método no arroja un puntero nulo porque primero verifica si el objeto es nulo o no. Si es nulo, simplemente imprime la cadena"null"
. De lo contrario, llamará altoString
método de ese objeto.Agregar más detalles: métodos de impresión internamente llaman
String.valueOf(object)
método en el objeto de entrada. Y en elvalueOf
método, esta comprobación ayuda a evitar una excepción de puntero nulo:Para el resto de su confusión, llamar a cualquier método en un objeto nulo debería arrojar una excepción de puntero nulo, si no un caso especial.
fuente
Puede emitir
null
a cualquier tipo de referencia. También puede llamar a métodos que manejan anull
como argumento, por ejemplo,System.out.println(Object)
sí, pero no puede hacer referencia a unnull
valor y llamar a un método sobre él.Por cierto, hay una situación difícil en la que parece que puede llamar a métodos estáticos en los
null
valores.fuente
t.yield() -> Thread.yeld()
todos modos? Similar a cómofinal int i = 1; while (i == 1)
está optimizado parawhile(true)
Esto es por diseño. Puede emitir
null
a cualquier tipo de referencia. De lo contrario, no podría asignarlo a variables de referencia.fuente
La conversión de valores nulos es necesaria para la siguiente construcción donde un método está sobrecargado y si se pasa nulo a estos métodos sobrecargados, entonces el compilador no sabe cómo aclarar la ambigüedad, por lo tanto, necesitamos escribir nulo en estos casos:
De lo contrario, no podría llamar al método que necesita.
fuente
String bar = null;
convierte elnull
valor enString
. Hasta ahora, solo tuve que emitir nulo explícitamente en una prueba en la que un método estaba sobrecargado y quería probar su comportamiento con una entrada nula. Aún así, es bueno saber que estaba a punto de escribir una respuesta similar antes de encontrar la suya.l instanceof Long
ys instanceof String
volveremosfalse
en estos casos.Println(Object)
usosString.valueOf()
Print(String)
hace cheque nulo.fuente
Muchas respuestas aquí ya mencionan
y
Me pregunté dónde se especifica eso y busqué la especificación Java:
La referencia nula siempre se puede asignar o emitir a cualquier tipo de referencia (§5.2, §5.3, §5.5).
Si la referencia es nula, se convierte en la cadena "nulo" (cuatro caracteres ASCII n, u, l, l).
fuente
Como otros han escrito, puede lanzar nulo a todo. Normalmente, no necesitarías eso, puedes escribir:
sin poner el elenco allí.
Pero hay ocasiones en que tales elencos tienen sentido:
a) si desea asegurarse de que se llame a un método específico, como:
entonces haría una diferencia si escribes
b) si tiene la intención de usar su IDE para generar código; por ejemplo, normalmente escribo pruebas unitarias como:
Estoy haciendo TDD; Esto significa que la clase "MyClassUnderTest" probablemente todavía no existe. Al escribir ese código, puedo usar mi IDE para generar primero la nueva clase; y luego generar un constructor que acepte un argumento "Lo que sea" "listo para usar": el IDE puede deducir de mi prueba que el constructor debe tomar exactamente un argumento de tipo Whatever.
fuente
Imprimir :
Valor de :
Simplemente devolverá una cadena con el valor "nulo" cuando el objeto lo sea
null
.fuente
Esto es muy útil cuando se usa un método que de otra manera sería ambiguo. Por ejemplo: JDialog tiene constructores con las siguientes firmas:
Necesito usar este constructor, porque quiero configurar GraphicsConfiguration, pero no tengo padre para este diálogo, por lo que el primer argumento debería ser nulo. Utilizando
es ambiguo, por lo que en este caso puedo reducir la llamada al convertir nulo en uno de los tipos admitidos:
fuente
Esta característica del lenguaje es conveniente en esta situación.
Si memberHashMap.get ("Nombre") devuelve nulo, aún querría que el método anterior devuelva nulo sin lanzar una excepción. No importa cuál sea la clase, nulo es nulo.
fuente