Di Jawa saya diberitahu bahwa ketika melakukan pemeriksaan null seseorang harus menggunakan == daripada .equals (). Apa alasannya?
Di Jawa saya diberitahu bahwa ketika melakukan pemeriksaan null seseorang harus menggunakan == daripada .equals (). Apa alasannya?
Jawaban:
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 equals
adalah sebuah metode, jika Anda mencoba untuk memanggilnya pada null
referensi, Anda akan mendapatkan NullPointerException
.
Misalnya:
class Foo {
private int data;
Foo(int d) {
this.data = d;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) {
return false;
}
return ((Foo)other).data == this.data;
}
/* In a real class, you'd override `hashCode` here as well */
}
Foo f1 = new Foo(5);
Foo f2 = new Foo(5);
System.out.println(f1 == f2);
// outputs false, they're distinct object instances
System.out.println(f1.equals(f2));
// outputs true, they're "equal" according to their definition
Foo f3 = null;
System.out.println(f3 == null);
// outputs true, `f3` doesn't have any object reference assigned to it
System.out.println(f3.equals(null));
// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything
System.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
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()
pada null
Anda akan mendapatkanNullPointerException
Jadi selalu disarankan untuk memeriksa nullity sebelum menjalankan metode di mana pun itu berlaku
if(str!=null && str.equals("hi")){
//str contains hi
}
Lihat juga
if ("hi".equals(str))
.
someObject.equals(null)
akan memunculkan a NullPointerException
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:
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.
Sejak: 1.7
Di Java 0 atau null adalah tipe sederhana dan bukan objek.
Metode sama dengan () tidak dibuat untuk tipe sederhana. Jenis sederhana dapat dicocokkan dengan ==.
foo.equals(null)
Apa yang terjadi jika foo bernilai null?
Anda mendapatkan NullPointerException.
Menurut sumber , tidak masalah apa yang digunakan untuk implementasi metode default:
public boolean equals(Object object) {
return this == object;
}
Tetapi Anda tidak bisa yakin tentang equals
di kelas khusus.
equals
hanya dapat mengembalikan false
atau menyebabkan NullPointerException
(atau sesuatu yang berbeda jika equals
metode yang diganti tidak masuk akal).
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.
String firstname = null;
String lastname = null;
if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}
Contoh potongan di atas akan kembali sama!
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.
false
atau NullPointerException
(jika equals
tidak diganti menjadi sesuatu yang buruk).
berikut adalah contoh di mana str != null
tetapi str.equals(null)
saat menggunakanorg.json
JSONObject jsonObj = new JSONObject("{field :null}");
Object field = jsonObj.get("field");
System.out.println(field != null); // => true
System.out.println( field.equals(null)); //=> true
System.out.println( field.getClass()); // => org.json.JSONObject$Null
EDIT: di
sini adalah kelas org.json.JSONObject $ Null :
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/
private static final class Null {
/**
* 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.
*/
@Override
public boolean equals(Object object) {
return object == null || object == this;
}
}
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.
str != null
dan str.equals(null)
kembali true
saat menggunakan org.json ."?
jsonObject
berisi kunci "field" itu sebabnya field
bukan null, ia memiliki referensi yang berisi json.org.JSONObject$Null
objek
Null
seperti null
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:
if(str.trim().length() <=0 ) {
// is null !
}
""
memiliki panjang 0) adalah sesuatu yang sama sekali berbeda dari null
referensi (yaitu tanpa string).
Kode Anda melanggar hukum Demeter. Itulah mengapa lebih baik melakukan refaktorisasi desain itu sendiri. Sebagai solusinya, Anda dapat menggunakan Opsional
obj = Optional.ofNullable(object1)
.map(o -> o.getIdObject11())
.map(o -> o.getIdObject111())
.map(o -> o.getDescription())
.orElse("")
di atas adalah untuk memeriksa hierarki suatu objek jadi cukup gunakan
Optional.ofNullable(object1)
jika Anda hanya memiliki satu objek untuk diperiksa
Semoga ini membantu !!!!
Anda selalu bisa melakukannya
if (str == null || str.equals(null))
Ini pertama-tama akan memeriksa referensi objek dan kemudian memeriksa objek itu sendiri yang menyediakan referensi isnt null.
x.equals(null)
.
equals()
dan melihat nol . Ketika Anda mencobanya akan langsung terlihat jelas