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, porthislo que no es nulo.El JLS dice:
Si invocaste un método desde un objeto, entonces el objeto existe o tendrías un
NullPointerExceptionantes (o es un método estático pero luego no puedes usarlothis).Recursos:
thispalabra clavefuente
thismé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 cuandofoose 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.thispalabra 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?"
thisnunca puede ser nulofuente
this != nullfuera evidente. No lo es; en C ++, por ejemplo,thisbien puede serloNULLpara 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.3o antes, entonces un externothispuede sernull. O al menos solía hacerlo ...fuente
Outer.this.memberNo. 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. Sithislonullhubiera, 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,
thisno se define, ya quethisestá asociado con instancias y no con clases. Creo que daría un error de compilador intentar usar unathispalabra clave en un contexto estático.fuente
Un normal
thisnunca puede estarnullen 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
thisdeberí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
Innercon unanullreferencia a suOuterha fallado.De hecho, si te quedas dentro del sobre de "Java puro", no podrás romperlo.
Sin embargo, cada
Innerinstancia tiene unfinalcampo sintético oculto (llamado"this$0") que contiene la referencia alOuter. Si es realmente complicado, es posible utilizar medios "no puros" para asignarnullal campo.Unsafepara hacerlo.De cualquier manera que lo haga, el resultado final es que la
Outer.thisexpresión se evaluará comonull2 .En resumen, es posible que un calificado
thisseanull. 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
nullreferencia, seNullPointerExceptionlanzará desde Java VM. Esto es por especificación, por lo que si su máquina virtual Java cumple estrictamente con la especificación,thisnunca lo seríanull.fuente
Si el método es estático, entonces no hay ninguno
this. Si el método es virtual, entoncesthisno puede ser nulo, porque para llamar al método, el tiempo de ejecución necesitará hacer referencia a la vtable usando elthispuntero. Si el método no es virtual , entonces sí, es posible quethissea nulo.C # y C ++ permiten métodos no virtuales, pero en Java todos los métodos no estáticos son virtuales, por
thislo 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