Melihat baris ini dalam metode kelas dan reaksi pertama saya adalah mengejek pengembang yang menulisnya .. Tapi kemudian, saya pikir saya harus memastikan bahwa saya benar terlebih dahulu.
public void dataViewActivated(DataViewEvent e) {
if (this != null)
// Do some work
}
Akankah baris itu dievaluasi sebagai salah?
Jawaban:
Tidak, itu tidak bisa. Jika Anda menggunakan
this
, maka Anda dalam contoh jadithis
bukan null.JLS mengatakan:
Jika Anda memanggil metode dari suatu objek, maka objek itu ada atau Anda akan memiliki
NullPointerException
sebelumnya (atau itu metode statis tetapi kemudian, Anda tidak dapat menggunakannyathis
di dalamnya).Sumber:
this
kata kuncisumber
this
metode contoh bisa menjadi NULL. Jadi saya tidak begitu yakin ini adalah alasan yang cukup di Jawa.foo.bar()
akan dilemparkan ketikafoo
ditemukannull
. itu terjadi sebelum memasuki metode, tetapi kisah sebenarnya adalah tidak ada metode untuk mencoba memanggil.this
kata kunci dan dikompilasi, nilainya bukan nol saat Anda mengamatinya. Tetapi seperti yang dikatakan orang lain, hal itu tidak mencegah NPE saat mencoba memanggil metode, misalnya. Tapi itu benar-benar di luar kendali Anda sebagai metode dan pemeriksaan nol di dalam metode tidak akan mengubah apa pun.Ini seperti bertanya pada diri sendiri, "Apakah saya hidup?"
this
tidak pernah bisa menjadi nolsumber
this != null
bukti dengan sendirinya. Ini tidak - dalam C ++, misalnya,this
mungkinNULL
, untuk metode non-virtual.Tidak pernah , kata kunci 'this' itu sendiri mewakili instance (objek) yang hidup saat ini dari kelas itu dalam lingkup kelas itu, yang dengannya Anda dapat mengakses semua bidang dan anggotanya (termasuk konstruktor) dan yang terlihat dari kelas induknya.
Dan, yang lebih menarik, coba atur:
Pikirkan tentang itu? Bagaimana mungkin, bukankah itu seperti memotong dahan tempat Anda duduk. Karena kata kunci 'ini' tersedia dalam ruang lingkup kelas maka segera setelah Anda mengatakan ini = null; Di mana saja di dalam kelas maka pada dasarnya Anda meminta JVM untuk membebaskan memori yang ditugaskan ke objek itu di tengah-tengah beberapa operasi yang JVM tidak bisa membiarkannya terjadi karena ia perlu kembali dengan aman setelah menyelesaikan operasi itu.
Selain itu, mencoba
this = null;
akan menghasilkan kesalahan kompilator. Alasannya cukup sederhana, kata kunci di Java (atau bahasa apapun) tidak akan pernah bisa diberi nilai yaitu kata kunci tidak akan pernah bisa menjadi nilai kiri dari operasi penugasan.Contoh lain, Anda tidak bisa mengatakan:
sumber
this = null
. Instance saya berada di android tempat saya ingin menghapus tampilan dan menyetel objek yang menangani tampilan ke null. Kemudian saya ingin menggunakan metoderemove()
yang akan menghapus tampilan aktual dan kemudian objek penangan akan dianggap tidak berguna, jadi saya ingin membatalkannya.Jika Anda mengkompilasi dengan
-target 1.3
atau sebelumnya, maka mungkin luar . Atau setidaknya dulu ...this
null
sumber
Outer.this.member
Tidak. Untuk memanggil metode instance kelas, instance tersebut harus ada. Instance ini secara implisit diteruskan sebagai parameter ke metode, direferensikan oleh
this
. Jikathis
adanull
maka tidak akan ada contoh untuk memanggil metode.sumber
Bahasa tidak cukup hanya memaksakannya. VM perlu memberlakukannya. Kecuali jika VM memberlakukannya, Anda dapat menulis kompiler yang tidak memberlakukan pemeriksaan null sebelum memanggil metode yang ditulis di Java. Opcode untuk pemanggilan metode instance termasuk memuat referensi ini ke tumpukan, lihat: http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14787 . Mengganti ini untuk ref null memang akan menghasilkan tes yang salah
sumber
Dalam metode kelas statis,
this
tidak ditentukan karenathis
dikaitkan dengan instance dan bukan kelas. Saya percaya ini akan memberikan kesalahan kompiler untuk mencoba menggunakanthis
kata kunci dalam konteks statis.sumber
Sebuah normal
this
tidak pernah bisanull
dalam kode Java 1 yang sebenarnya , dan contoh Anda menggunakan normalthis
. Lihat jawaban lainnya untuk lebih jelasnya.Seorang yang memenuhi syarat
this
seharusnya tidak pernahnull
, tetapi mungkin untuk memecahkan ini. Pertimbangkan hal berikut:Saat kita ingin membuat sebuah instance
Inner
, kita perlu melakukan ini:Outputnya adalah:
menunjukkan bahwa upaya kami untuk membuat
Inner
dengannull
referensi ke dalamnyaOuter
telah gagal.Faktanya, jika Anda tetap berada di dalam amplop "Java Murni", Anda tidak dapat memecahkannya.
Namun, setiap
Inner
instance memilikifinal
bidang sintetis tersembunyi (disebut"this$0"
) yang berisi referensi keOuter
. Jika Anda benar-benar rumit, Anda dapat menggunakan cara "non-murni" untuk menetapkannull
ke bidang.Unsafe
untuk melakukannya.Apa pun cara Anda melakukannya, hasil akhirnya adalah
Outer.this
ekspresi akan bernilainull
2 .Singkatnya, itu adalah mungkin untuk memenuhi syarat
this
untuk menjadinull
. Tetapi tidak mungkin jika program Anda mengikuti aturan "Pure Java".1 - Saya mengabaikan trik seperti "menulis" bytecode dengan tangan dan meneruskannya sebagai Java asli, mengubah bytecode menggunakan BCEL atau yang serupa, atau melompat ke kode asli dan mengotak-atik register yang disimpan. IMO, itu BUKAN Java. Secara hipotesis, hal-hal seperti itu mungkin juga terjadi sebagai akibat dari bug JVM ... tapi saya tidak ingat setiap melihat laporan bug.
2 - Sebenarnya, JLS tidak mengatakan seperti apa perilakunya, dan bisa jadi tergantung pada implementasi ... antara lain.
sumber
Saat Anda memanggil metode dengan
null
referensi,NullPointerException
akan dibuang dari Java VM. Ini berdasarkan spesifikasi jadi jika VM Java Anda benar-benar sesuai dengan spesifikasi,this
tidak akan pernahnull
.sumber
Jika metodenya statis, maka tidak ada
this
. Jika metode ini virtual, makathis
tidak boleh nol, karena untuk memanggil metode tersebut, waktu proses perlu merujuk ke vtable menggunakanthis
pointer. Jika metodenya tidak virtual maka, ya, mungkinthis
nihil.C # dan C ++ mengizinkan metode non-virtual, tetapi di Java semua metode non-statis adalah virtual, jadi
this
tidak akan pernah null.sumber
tl; dr, "ini" hanya dapat dipanggil dari metode non-statis dan kita semua tahu bahwa metode non-statis dipanggil dari beberapa jenis objek yang tidak boleh null.
sumber