Um normal thisnunca pode estar nullno 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 Innercom uma nullreferência a Outerele falhou.
Na verdade, se você ficar dentro do envelope "Pure Java", não poderá quebrar isso.
No entanto, cada Innerinstância possui um finalcampo 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 nullao campo.
- Você poderia usar
Unsafepara 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.thisexpressão será avaliada como null2 .
Em suma, é possível para um qualificado thisser 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.