Vi esta linha em um método de classe e minha primeira reação foi ridicularizar o desenvolvedor que a escreveu. Mas então, achei que deveria ter certeza de que estava certo primeiro.
public void dataViewActivated(DataViewEvent e) {
if (this != null)
// Do some work
}
Essa linha será avaliada como falsa?
Respostas:
Não, não pode. Se você estiver usando
this
, então você está na instância, entãothis
não é nulo.O JLS diz:
Se você invocou um método de um objeto, então o objeto existe ou você teria um
NullPointerException
antes (ou é um método estático, mas você não pode usarthis
nele).Recursos :
this
palavra - chavefonte
this
de um método de instância pode ser NULL. Portanto, não estou muito convencido de que essa seja uma razão suficiente em Java.foo.bar()
seria lançada quandofoo
descobrisse que eranull
. isso acontece antes de entrar no método, mas a história real é que não há método para tentar chamar.this
palavra-chave e ela compila, ela não é nula quando você a observa. Mas, como outros dizem, isso não impede um NPE ao tentar invocar o método, por exemplo, Mas isso está completamente fora de seu controle como um método e uma verificação de nulo dentro do método não vai mudar nada.É como se perguntar "Estou vivo?"
this
nunca pode ser nulofonte
this != null
era evidente. Não é - em C ++, por exemplo,this
pode muito bem serNULL
, para um método não virtual.Não , nunca , a própria palavra-chave 'this' representa a instância atual viva (objeto) daquela classe dentro do escopo daquela classe, com a qual você pode acessar todos os seus campos e membros (incluindo construtores) e os visíveis de sua classe pai.
E, o mais interessante, tente configurá-lo:
Pense nisso? Como pode ser possível, não seria como cortar o galho em que você está sentado. Como a palavra-chave 'this' está disponível no escopo da classe, assim que você disser this = null; em qualquer lugar da classe, você basicamente está pedindo à JVM para liberar a memória atribuída a esse objeto no meio de alguma operação que a JVM simplesmente não pode permitir que aconteça, pois precisa retornar com segurança após terminar essa operação.
Além disso, a tentativa
this = null;
resultará em erro do compilador. A razão é muito simples, uma palavra-chave em Java (ou qualquer linguagem) nunca pode receber um valor, ou seja, uma palavra-chave nunca pode ser o valor esquerdo de uma operação de atribuição.Outros exemplos, você não pode dizer:
fonte
this = null
. Minha instância foi no android, onde eu queria remover uma visualização e definir o objeto que manipulava a visualização como nulo. Então eu queria usar um métodoremove()
que removeria a visão real e então o objeto-manipulador se tornaria inútil, então eu queria anulá-lo.Se você compilar com
-target 1.3
ou anterior, então um externothis
pode sernull
. Ou pelo menos costumava ...fonte
Outer.this.member
Não. Para chamar um método de uma instância de uma classe, a instância deve existir. A instância é passada implicitamente como um parâmetro para o método, referenciado por
this
. Sethis
fossenull
, não teria havido instância para chamar um método.fonte
Não é suficiente que a linguagem o imponha. A VM precisa aplicá-lo. A menos que a VM aplique isso, você pode escrever um compilador que não aplique a verificação de nulo antes de chamar o método escrito em Java. Os opcodes para uma chamada de método de instância incluem o carregamento deste ref na pilha, consulte: http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14787 . Substituir isso por um ref nulo realmente resultaria no teste sendo falso
fonte
Em métodos de classe estática,
this
não é definido, poisthis
está associado a instâncias e não a classes. Acredito que seria um erro do compilador tentar usar athis
palavra-chave em contexto estático.fonte
Um normal
this
nunca pode estarnull
no código Java 1 real e seu exemplo usa um normalthis
. Veja outras respostas para mais detalhes.Um qualificado nunca
this
deve sernull
, mas é possível quebrar isso. Considere o seguinte:Quando queremos criar uma instância de
Inner
, precisamos fazer isso:O resultado é:
mostrando que nossa tentativa de criar um
Inner
com umanull
referência aOuter
ele falhou.Na verdade, se você ficar dentro do envelope "Pure Java", não poderá quebrar isso.
No entanto, cada
Inner
instância possui umfinal
campo sintético oculto (chamado"this$0"
) que contém a referência aoOuter
. Se você for realmente complicado, é possível usar meios "não puros" para atribuirnull
ao campo.Unsafe
para fazer isso.De qualquer maneira, o resultado final é que a
Outer.this
expressão será avaliada comonull
2 .Em suma, é possível para um qualificado
this
sernull
. 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.
fonte
Quando você invoca um método na
null
referência, oNullPointerException
será lançado do Java VM. Isso ocorre por especificação, portanto, se o seu Java VM estiver estritamente de acordo com a especificação,this
nunca o seránull
.fonte
Se o método for estático, não haverá nenhum
this
. Se o método for virtual, entãothis
não pode ser nulo, porque para chamar o método, o tempo de execução precisará referenciar a vtable usando othis
ponteiro. Se o método não for virtual , sim, é possível quethis
seja nulo.C # e C ++ permitem métodos não virtuais, mas em Java todos os métodos não estáticos são virtuais, portanto
this
nunca serão nulos.fonte
tl; dr, "this" só pode ser chamado de um método não estático e todos nós sabemos que um método não estático é chamado de algum tipo de objeto que não pode ser nulo.
fonte