Un normale this
può mai essere null
nel codice reale Java , e il vostro esempio utilizza un normale this
. Vedi le altre risposte per maggiori dettagli.
Un qualificato this
dovrebbe mai esserenull
, ma è possibile rompere questo. Si consideri il seguente:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Quando vogliamo creare un'istanza di Inner
, abbiamo bisogno di fare questo:
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
System.out.println(inner);
outer = null;
inner = outer.new Inner(); // FAIL ... throws an NPE
}
L'output è:
outer is [email protected]
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
dimostrando che il nostro tentativo di creare un Inner
con un riferimento null
al suo Outer
non riuscito.
Infatti, se ci si infila nella busta "Pure Java" non si può rompere questo.
Tuttavia, ogni Inner
istanza ha un nascosto final
campo sintetico (chiamato "this$0"
) che contiene il riferimento al Outer
. Se sei davvero ingannevole, è possibile utilizzare "non puro" per assegnare null
al campo.
- È possibile utilizzare
Unsafe
per farlo.
- È possibile utilizzare il codice nativo (ad es. JNI) per farlo.
- Si potrebbe fare usando la riflessione.
In entrambi i casi lo si fa, il risultato finale è che l'espressione Outer.this
valuterà a null
.
In breve, è possibile un qualificato this
essere null
. Ma è impossibile se il tuo programma segue le regole "Pure Java".
1 - lo sconto trucchi come "scrivere" i bytecode a mano e spacciandoli come reale Java, tweaking bytecode utilizzando BCEL o simili, o saltellando in codice nativo e manipolati con i registri salvati. IMO, NON è Java. Ipoteticamente, tali cose potrebbero anche accadere come risultato di un bug JVM ... ma non ricordo tutte le segnalazioni di bug di visualizzazione.
2 - In realtà, il JLS non dice quale sarà il comportamento e potrebbe dipendere dall'implementazione ... tra l'altro.
Sempre ridicolizzare prima e chiedere più tardi. È più facile scusarsi che riprendere un'occasione d'oro per abbattere qualcuno in una raffica di zolfo. –
Anch'io l'ho pensato ... In realtà dovevo controllare le annotazioni per assicurarmi che non fosse mio ... Quante volte ho scritto: –
+1 per il termine "raffica di zolfo". –