Vi esta línea en un método de clase y mi primera reacción fue ridiculizar al desarrollador que la escribió ... Pero luego, pensé que primero debería asegurarme de tener la razón.
public void dataViewActivated(DataViewEvent e) {
if (this != null)
// Do some work
}
¿Esa línea alguna vez se evaluará como falsa?
Respuestas:
No, no puede. Si está usando
this
, entonces está en la instancia, porthis
lo que no es nulo.El JLS dice:
Si invocaste un método desde un objeto, entonces el objeto existe o tendrías un
NullPointerException
antes (o es un método estático pero luego no puedes usarlothis
).Recursos:
this
palabra clavefuente
this
método de una instancia podría ser NULL. Así que no estoy del todo convencido de que esta sea una razón suficiente en Java.foo.bar()
se lanzaría cuandofoo
se descubra que esnull
. sucede antes de ingresar al método, pero la verdadera historia es que no hay ningún método para intentar llamar.this
palabra clave y se compila, no es nula cuando la observa. Pero como dicen otros, eso no evita una NPE al intentar invocar el método, por ejemplo, pero eso está completamente fuera de su control como método y una verificación nula dentro del método no va a cambiar nada.Es como preguntarse a sí mismo "¿Estoy vivo?"
this
nunca puede ser nulofuente
this != null
fuera evidente. No lo es; en C ++, por ejemplo,this
bien puede serloNULL
para un método no virtual.No , nunca , la palabra clave 'this' en sí misma representa la instancia viva actual (objeto) de esa clase dentro del alcance de esa clase, con la que puede acceder a todos sus campos y miembros (incluidos los constructores) y los visibles de su clase padre.
Y, lo que es más interesante, intente configurarlo:
¿Piénsalo? ¿Cómo puede ser posible? ¿No será como cortar la rama en la que estás sentado? Dado que la palabra clave 'esto' está disponible dentro del alcance de la clase, tan pronto como diga esto = nulo; en cualquier lugar dentro de la clase, básicamente le está pidiendo a JVM que libere la memoria asignada a ese objeto en medio de alguna operación que JVM simplemente no puede permitir que suceda, ya que necesita regresar de manera segura después de terminar esa operación.
Además, intentarlo
this = null;
resultará en un error del compilador. La razón es bastante simple, a una palabra clave en Java (o en cualquier idioma) nunca se le puede asignar un valor, es decir, una palabra clave nunca puede ser el valor izquierdo de una operación de asignación.Otros ejemplos, no puedes decir:
fuente
this = null
. Mi instancia estaba en Android donde quería eliminar una vista y establecer el objeto que maneja la vista en nulo. Luego quería usar un métodoremove()
que eliminara la vista real y luego el objeto controlador se volvería inútil, así que quería anularlo.Si compila con
-target 1.3
o antes, entonces un externothis
puede sernull
. O al menos solía hacerlo ...fuente
Outer.this.member
No. Para llamar a un método de una instancia de una clase, la instancia debe existir. La instancia se pasa implícitamente como un parámetro al método, referenciado por
this
. Sithis
lonull
hubiera, no habría habido ninguna instancia para llamar a un método.fuente
No es suficiente que el lenguaje lo haga cumplir. La VM necesita hacerla cumplir. A menos que la VM lo aplique, puede escribir un compilador que no aplique la verificación nula antes de llamar al método escrito en Java. Los códigos de operación para la invocación de un método de instancia incluyen cargar esta referencia en la pila; consulte: http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14787 . Sustituir esto por una referencia nula daría como resultado que la prueba fuera falsa
fuente
En los métodos de clases estáticas,
this
no se define, ya quethis
está asociado con instancias y no con clases. Creo que daría un error de compilador intentar usar unathis
palabra clave en un contexto estático.fuente
Un normal
this
nunca puede estarnull
en el código 1 de Java real , y su ejemplo usa un normalthis
. Vea otras las otras respuestas para más detalles.Un calificado nunca
this
debería serlonull
, pero es posible romper esto. Considera lo siguiente:Cuando queremos crear una instancia de
Inner
, necesitamos hacer esto:La salida es:
mostrando que nuestro intento de crear un
Inner
con unanull
referencia a suOuter
ha fallado.De hecho, si te quedas dentro del sobre de "Java puro", no podrás romperlo.
Sin embargo, cada
Inner
instancia tiene unfinal
campo sintético oculto (llamado"this$0"
) que contiene la referencia alOuter
. Si es realmente complicado, es posible utilizar medios "no puros" para asignarnull
al campo.Unsafe
para hacerlo.De cualquier manera que lo haga, el resultado final es que la
Outer.this
expresión se evaluará comonull
2 .En resumen, es posible que un calificado
this
seanull
. Pero es imposible si su programa sigue las reglas de "Java puro".1 - Descarto trucos como "escribir" los códigos de bytes a mano y pasarlos como Java real, ajustar los códigos de bytes usando BCEL o similar, o saltar al código nativo y jugar con los registros guardados. En mi opinión, eso NO es Java. Hipotéticamente, estas cosas también podrían suceder como resultado de un error de JVM ... pero no recuerdo todos los informes de errores que vi.
2 - En realidad, el JLS no dice cuál será el comportamiento, y podría depender de la implementación ... entre otras cosas.
fuente
Cuando invoca un método en
null
referencia, seNullPointerException
lanzará desde Java VM. Esto es por especificación, por lo que si su máquina virtual Java cumple estrictamente con la especificación,this
nunca lo seríanull
.fuente
Si el método es estático, entonces no hay ninguno
this
. Si el método es virtual, entoncesthis
no puede ser nulo, porque para llamar al método, el tiempo de ejecución necesitará hacer referencia a la vtable usando elthis
puntero. Si el método no es virtual , entonces sí, es posible quethis
sea nulo.C # y C ++ permiten métodos no virtuales, pero en Java todos los métodos no estáticos son virtuales, por
this
lo que nunca serán nulos.fuente
tl; dr, "this" sólo se puede llamar desde un método no estático y todos sabemos que se llama a un método no estático desde algún tipo de objeto que no puede ser nulo.
fuente