Um normal this
nunca pode estar null
no código Java 1 real e seu exemplo usa um normal this
. Veja outras respostas para mais detalhes.
Um qualificado nunca this
deve ser null
, mas é possível quebrar isso. Considere o seguinte:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Quando queremos criar uma instância de Inner
, precisamos fazer isso:
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
}
O resultado é:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
mostrando que nossa tentativa de criar um Inner
com uma null
referência a Outer
ele falhou.
Na verdade, se você ficar dentro do envelope "Pure Java", não poderá quebrar isso.
No entanto, cada Inner
instância possui um final
campo sintético oculto (chamado "this$0"
) que contém a referência ao Outer
. Se você for realmente complicado, é possível usar meios "não puros" para atribuir null
ao campo.
- Você poderia usar
Unsafe
para fazer isso.
- Você pode usar código nativo (por exemplo, JNI) para fazer isso.
- Você pode fazer isso usando reflexão.
De qualquer maneira, o resultado final é que a Outer.this
expressão será avaliada como null
2 .
Em suma, é possível para um qualificado this
ser null
. Mas é impossível se o seu programa seguir as regras do "Pure Java".
1 - Eu desconsidero truques como "escrever" os bytecodes manualmente e passá-los como Java real, ajustar os bytecodes usando BCEL ou similar, ou pular para o código nativo e mexer nos registros salvos. IMO, isso NÃO é Java. Hipoteticamente, essas coisas também podem acontecer como resultado de um bug da JVM ... mas não me lembro de ter visto todos os relatórios de bug.
2 - Na verdade, o JLS não informa qual será o comportamento, podendo ser dependente de implementação ... entre outras coisas.