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á al toString
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 el valueOf
método, esta comprobación ayuda a evitar una excepción de puntero nulo:
return (obj == null) ? "null" : obj.toString();
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.
Puede emitir null
a cualquier tipo de referencia. También puede llamar a métodos que manejan a null
como argumento, por ejemplo, System.out.println(Object)
sí, pero no puede hacer referencia a un null
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.
Thread t = null;
t.yield(); // Calls static method Thread.yield() so this runs fine.
t.yield() -> Thread.yeld()
todos modos? Similar a cómo final 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.
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:
class A {
public void foo(Long l) {
// do something with l
}
public void foo(String s) {
// do something with s
}
}
new A().foo((String)null);
new A().foo((Long)null);
De lo contrario, no podría llamar al método que necesita.
String bar = null;
convierte el null
valor en String
. 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
y s instanceof String
volveremos false
en estos casos.
Muchas respuestas aquí ya mencionan
Puede convertir nulo a cualquier tipo de referencia
y
Si el argumento es nulo, entonces una cadena igual a "nulo"
Me pregunté dónde se especifica eso y busqué la especificación Java:
Si la referencia es nula, se convierte en la cadena "nulo" (cuatro caracteres ASCII n, u, l, l).
Como otros han escrito, puede lanzar nulo a todo. Normalmente, no necesitarías eso, puedes escribir:
String nullString = null;
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:
void foo(String bar) { ... }
void foo(Object bar) { ... }
entonces haría una diferencia si escribes
foo((String) null) vs. foo(null)
b) si tiene la intención de usar su IDE para generar código; por ejemplo, normalmente escribo pruebas unitarias como:
@Test(expected=NullPointerException.class)
public testCtorWithNullWhatever() {
new MyClassUnderTest((Whatever) null);
}
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.
Imprimir :
Imprime un objeto. La cadena producida por el método String.valueOf (Object) se traduce a bytes
Valor de :
si el argumento es nulo, entonces una cadena igual a "nulo"; de lo contrario, se devuelve el valor de obj.toString ().
Simplemente devolverá una cadena con el valor "nulo" cuando el objeto lo sea null
.
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:
JDialog(Frame, String, boolean, GraphicsConfiguration)
JDialog(Dialog, String, boolean, GraphicsConfiguration)
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
JDialog(null, String, boolean, Graphicsconfiguration)
es ambiguo, por lo que en este caso puedo reducir la llamada al convertir nulo en uno de los tipos admitidos:
JDialog((Frame) null, String, boolean, GraphicsConfiguration)
Esta característica del lenguaje es conveniente en esta situación.
public String getName() {
return (String) memberHashMap.get("Name");
}
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.