Hal termudah adalah mencoba memeriksa equals()dan melihat nol . Ketika Anda mencobanya akan langsung terlihat jelas
Goran Jovic
Omong-omong, pencarian google dengan kata kunci "java null check" (tanpa tanda kutip) memberi saya sebagai salah satu hit teratas utas ini , yang memiliki info yang sama dengan jawaban di sini.
Mitch Schwartz
Jawaban:
179
Mereka adalah dua hal yang sangat berbeda. ==membandingkan referensi objek, jika ada, yang dikandung oleh variabel. .equals()memeriksa untuk melihat apakah dua objek sama menurut kontraknya untuk apa arti persamaan. Sangat mungkin untuk dua contoh objek berbeda untuk menjadi "sama" menurut kontrak mereka. Dan kemudian ada detail kecil yang karena equalsadalah sebuah metode, jika Anda mencoba untuk memanggilnya pada nullreferensi, Anda akan mendapatkan NullPointerException.
Misalnya:
classFoo{privateint data;Foo(int d){this.data = d;}@Overridepublicboolean equals(Object other){if(other ==null|| other.getClass()!=this.getClass()){returnfalse;}return((Foo)other).data ==this.data;}/* In a real class, you'd override `hashCode` here as well */}Foo f1 =newFoo(5);Foo f2 =newFoo(5);System.out.println(f1 == f2);// outputs false, they're distinct object instancesSystem.out.println(f1.equals(f2));// outputs true, they're "equal" according to their definitionFoo f3 =null;System.out.println(f3 ==null);// outputs true, `f3` doesn't have any object reference assigned to itSystem.out.println(f3.equals(null));// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anythingSystem.out.println(f1.equals(f3));// Outputs false, since `f1` is a valid instance but `f3` is null,// so one of the first checks inside the `Foo#equals` method will// disallow the equality because it sees that `other` == null
@ Xepoch: Tidak, saya biasanya tidak membuat bidang publik (meskipun tidak terlalu penting untuk contoh ini). Mengapa?
TJ Crowder
@TJ Crowder "Mereka adalah dua hal yang sama sekali berbeda .." secara umum ya. Namun, implementasi default keduanya sama, jika pemahaman saya benar. Melihat kode sumber, .equals () pada dasarnya melakukan pemeriksaan ==. hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/…
Ayush
1
@Ayush - Itu defaultnya Object, ya. Ini diganti oleh sejumlah besar kelas JDK. Tapi yang penting bukanlah tentang implementasi, ini tentang semantik. (Catatan tambahan: JDK7 sangat ketinggalan zaman.)
TJ Crowder
Benar, itu masuk akal, hanya ingin menjelaskan.
Ayush
38
jika Anda memanggil .equals()pada nullAnda akan mendapatkanNullPointerException
Jadi selalu disarankan untuk memeriksa nullity sebelum menjalankan metode di mana pun itu berlaku
Contoh Anda umumnya lebih baik ditulis sebagai if ("hi".equals(str)).
ColinD
3
@ user368186: intinya bukanlah apakah metode sama dengan menyertakan pemeriksaan null. Jika referensi objek Anda nol, panggilan someObject.equals(null)akan memunculkan a NullPointerExceptiontanpa pernah memasukkan metode sama dengan.
Dave Costa
2
@ColinD Setuju hanya mendemonstrasikan di sini
Jigar Joshi
2
Selalu disarankan untuk menghindari nol dengan cara apa pun, jadi Anda tidak perlu pemeriksaan nol sama sekali;).
fwielstra
2
Anda selalu dapat menggunakan Objects.equals(a, b)Itu tidak akan menaikkan NullPointerException, tetapi masih bergantung pada metode "sama" dari "a" dan "b"
Sejak Java 1.7, jika Anda ingin membandingkan dua Objek yang mungkin nol, saya merekomendasikan fungsi ini:
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
Kelas ini terdiri dari metode utilitas statis untuk beroperasi pada objek. Utilitas ini mencakup metode null-safe atau null-tolerant untuk menghitung kode hash suatu objek, mengembalikan string untuk suatu objek, dan membandingkan dua objek.
Hanya untuk membuatnya lebih terlihat untuk orang lain (lihat jawaban chin90 ini atau javadoc ): Objects.equals(null, null)akan kembali true- keep itu dalam pikiran.
Thomas
20
Di Java 0 atau null adalah tipe sederhana dan bukan objek.
Metode sama dengan () tidak dibuat untuk tipe sederhana. Jenis sederhana dapat dicocokkan dengan ==.
Itu penting, karena equalshanya dapat mengembalikan falseatau menyebabkan NullPointerException(atau sesuatu yang berbeda jika equalsmetode yang diganti tidak masuk akal).
Tom
2
Jika kita menggunakan metode => .equals
if(obj.equals(null))// Which mean null.equals(null) when obj will be null.
Jika obj Anda menjadi null, maka Object akan mengeluarkan Null Point Exception.
Object.equals aman null, namun perlu diketahui bahwa jika dua objek null, object.equals akan mengembalikan true jadi pastikan untuk memeriksa bahwa objek yang Anda bandingkan bukan null (atau tahan nilai null) sebelum menggunakan object.equals for perbandingan.
Seperti yang dinyatakan oleh JavaDoc (selalu bijaksana untuk membacanya): Consequently, if both arguments are null, true is returned. ...:)
Thomas
1
Karena equal adalah fungsi yang diturunkan dari kelas Objek, fungsi ini membandingkan item dari kelas. jika Anda menggunakannya dengan null maka akan mengembalikan false karena konten kelas tidak null. Selain itu == membandingkan referensi ke suatu objek.
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/privatestaticfinalclassNull{/**
* A Null object is equal to the null value and to itself.
*
* @param object
* An object to test for nullness.
* @return true if the object parameter is the JSONObject.NULL object or
* null.
*/@Overridepublicboolean equals(Object object){return object ==null|| object ==this;}}
Masalahnya di sini adalah yang field.equals(null)mengembalikan true. Ini merusak perilaku Java yang biasa dan karena itu membingungkan. Ini seharusnya hanya bekerja untuk field.equals("null"), setidaknya dalam sudut pandang saya. Saya tidak tahu mengapa para pengembang perpustakaan berpikir, bahwa ini akan bagus untuk didukung.
Tom
Btw, kalimat pertama Anda memiliki masalah tata bahasa dan tidak jelas apa yang Anda maksud dengannya. Apakah maksud Anda "Ini adalah contoh di mana str != nulldan str.equals(null)kembali truesaat menggunakan org.json ."?
Tom
Saya pikir itu karena jsonObjectberisi kunci "field" itu sebabnya fieldbukan null, ia memiliki referensi yang berisi json.org.JSONObject$Null objek
dina
Ya, tapi saya tidak akan memperlakukan Nullseperti nulldan akan menggunakan "null"sebagai gantinya. Tapi saya rasa mereka melakukan itu untuk menghindari permintaan Strings. Tetapi bahkan dengan lib itu, field.equals(null)masih hampir selalu menjadi masalah: P.
Tom
0
Jadi saya tidak pernah bingung dan terhindar dari masalah dengan solusi ini:
Selain itu string kosong ( ""memiliki panjang 0) adalah sesuatu yang sama sekali berbeda dari nullreferensi (yaitu tanpa string).
Thomas
0
Saya telah menemukan kasus ini tadi malam.
Saya menentukan bahwa:
Tidak ada metode equals () untuk null Jadi, Anda tidak bisa memanggil metode yang tidak ada jika Anda tidak memiliki
- >>> Itulah alasan mengapa kami menggunakan == untuk memeriksa null
Kode Anda melanggar hukum Demeter. Itulah mengapa lebih baik melakukan refaktorisasi desain itu sendiri. Sebagai solusinya, Anda dapat menggunakan Opsional
equals()
dan melihat nol . Ketika Anda mencobanya akan langsung terlihat jelasJawaban:
Mereka adalah dua hal yang sangat berbeda.
==
membandingkan referensi objek, jika ada, yang dikandung oleh variabel..equals()
memeriksa untuk melihat apakah dua objek sama menurut kontraknya untuk apa arti persamaan. Sangat mungkin untuk dua contoh objek berbeda untuk menjadi "sama" menurut kontrak mereka. Dan kemudian ada detail kecil yang karenaequals
adalah sebuah metode, jika Anda mencoba untuk memanggilnya padanull
referensi, Anda akan mendapatkanNullPointerException
.Misalnya:
sumber
public int data
?Object
, ya. Ini diganti oleh sejumlah besar kelas JDK. Tapi yang penting bukanlah tentang implementasi, ini tentang semantik. (Catatan tambahan: JDK7 sangat ketinggalan zaman.)jika Anda memanggil
.equals()
padanull
Anda akan mendapatkanNullPointerException
Jadi selalu disarankan untuk memeriksa nullity sebelum menjalankan metode di mana pun itu berlaku
Lihat juga
sumber
if ("hi".equals(str))
.someObject.equals(null)
akan memunculkan aNullPointerException
tanpa pernah memasukkan metode sama dengan.Objects.equals(a, b)
Itu tidak akan menaikkan NullPointerException, tetapi masih bergantung pada metode "sama" dari "a" dan "b"Selain jawaban yang diterima ( https://stackoverflow.com/a/4501084/6276704 ):
Sejak Java 1.7, jika Anda ingin membandingkan dua Objek yang mungkin nol, saya merekomendasikan fungsi ini:
sumber
Objects.equals(null, null)
akan kembalitrue
- keep itu dalam pikiran.Di Java 0 atau null adalah tipe sederhana dan bukan objek.
Metode sama dengan () tidak dibuat untuk tipe sederhana. Jenis sederhana dapat dicocokkan dengan ==.
sumber
Apa yang terjadi jika foo bernilai null?
Anda mendapatkan NullPointerException.
sumber
Jika variabel Object adalah null, seseorang tidak dapat memanggil metode equals () di atasnya, sehingga pemeriksaan referensi objek null adalah tepat.
sumber
Jika Anda mencoba memanggil sama dengan pada referensi objek null, maka Anda akan mendapatkan pengecualian pointer nol.
sumber
Menurut sumber , tidak masalah apa yang digunakan untuk implementasi metode default:
Tetapi Anda tidak bisa yakin tentang
equals
di kelas khusus.sumber
equals
hanya dapat mengembalikanfalse
atau menyebabkanNullPointerException
(atau sesuatu yang berbeda jikaequals
metode yang diganti tidak masuk akal).Jika kita menggunakan metode => .equals
Jika obj Anda menjadi null, maka Object akan mengeluarkan Null Point Exception.
jadi kita harus menggunakan ==
itu akan membandingkan referensi.
sumber
Object.equals aman null, namun perlu diketahui bahwa jika dua objek null, object.equals akan mengembalikan true jadi pastikan untuk memeriksa bahwa objek yang Anda bandingkan bukan null (atau tahan nilai null) sebelum menggunakan object.equals for perbandingan.
Contoh potongan di atas akan kembali sama!
sumber
Consequently, if both arguments are null, true is returned. ...
:)Karena equal adalah fungsi yang diturunkan dari kelas Objek, fungsi ini membandingkan item dari kelas. jika Anda menggunakannya dengan null maka akan mengembalikan false karena konten kelas tidak null. Selain itu == membandingkan referensi ke suatu objek.
sumber
false
atauNullPointerException
(jikaequals
tidak diganti menjadi sesuatu yang buruk).berikut adalah contoh di mana
str != null
tetapistr.equals(null)
saat menggunakanorg.json
EDIT: di sini adalah kelas org.json.JSONObject $ Null :
sumber
field.equals(null)
mengembalikan true. Ini merusak perilaku Java yang biasa dan karena itu membingungkan. Ini seharusnya hanya bekerja untukfield.equals("null")
, setidaknya dalam sudut pandang saya. Saya tidak tahu mengapa para pengembang perpustakaan berpikir, bahwa ini akan bagus untuk didukung.str != null
danstr.equals(null)
kembalitrue
saat menggunakan org.json ."?jsonObject
berisi kunci "field" itu sebabnyafield
bukan null, ia memiliki referensi yang berisijson.org.JSONObject$Null
objekNull
sepertinull
dan akan menggunakan"null"
sebagai gantinya. Tapi saya rasa mereka melakukan itu untuk menghindari permintaan Strings. Tetapi bahkan dengan lib itu,field.equals(null)
masih hampir selalu menjadi masalah: P.Jadi saya tidak pernah bingung dan terhindar dari masalah dengan solusi ini:
sumber
""
memiliki panjang 0) adalah sesuatu yang sama sekali berbeda darinull
referensi (yaitu tanpa string).Saya telah menemukan kasus ini tadi malam.
Saya menentukan bahwa:
sumber
Kode Anda melanggar hukum Demeter. Itulah mengapa lebih baik melakukan refaktorisasi desain itu sendiri. Sebagai solusinya, Anda dapat menggunakan Opsional
di atas adalah untuk memeriksa hierarki suatu objek jadi cukup gunakan
jika Anda hanya memiliki satu objek untuk diperiksa
Semoga ini membantu !!!!
sumber
Anda selalu bisa melakukannya
Ini pertama-tama akan memeriksa referensi objek dan kemudian memeriksa objek itu sendiri yang menyediakan referensi isnt null.
sumber
x.equals(null)
.