Bagaimana cara memeriksa string terhadap null di java?


93

Bagaimana cara memeriksa string terhadap null di java? saya menggunakan

stringname.equalsignorecase(null)

tapi tidak berhasil.

Jawaban:


165

string == nullmembandingkan jika objeknya nol. string.equals("foo")membandingkan nilai di dalam objek itu. string == "foo"tidak selalu berhasil, karena Anda mencoba untuk melihat apakah objeknya sama, bukan nilai yang diwakilinya.


Jawaban yang lebih panjang:

Jika Anda mencoba ini, itu tidak akan berhasil, seperti yang Anda temukan:

String foo = null;
if (foo.equals(null)) {
    // That fails every time. 
}

Alasannya adalah bahwa foo adalah null, jadi tidak tahu apa itu .equals; tidak ada objek di sana untuk memanggil .equals.

Apa yang mungkin Anda inginkan adalah:

String foo = null;
if (foo == null) {
    // That will work.
}

Cara khas untuk melindungi diri Anda dari nol saat berhadapan dengan Strings adalah:

String foo = null;
String bar = "Some string";
...
if (foo != null && foo.equals(bar)) {
    // Do something here.
}

Dengan cara itu, jika foo adalah null, itu tidak mengevaluasi paruh kedua bersyarat, dan semuanya baik-baik saja.

Cara mudah, jika Anda menggunakan literal String (bukan variabel), adalah:

String foo = null;
...
if ("some String".equals(foo)) {
    // Do something here.
}

Jika Anda ingin mengatasinya, Apache Commons memiliki kelas - StringUtils - yang menyediakan operasi String aman-null.

if (StringUtils.equals(foo, bar)) {
    // Do something here.
}

Tanggapan lain bercanda, dan berkata Anda harus melakukan ini:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

Tolong jangan lakukan itu. Anda hanya boleh memberikan pengecualian untuk kesalahan yang luar biasa; jika Anda mengharapkan null, Anda harus memeriksanya terlebih dahulu, dan tidak membiarkannya mengeluarkan pengecualian.

Di kepala saya, ada dua alasan untuk ini. Pertama, pengecualiannya lambat; memeriksa null itu cepat, tetapi ketika JVM mengeluarkan pengecualian, itu membutuhkan banyak waktu. Kedua, kode jauh lebih mudah dibaca dan dipelihara jika Anda hanya memeriksa penunjuk nol sebelumnya.


2
Anda melewatkan versi Yoda, juga bekerja setiap saat: if ("foo" .equalsIgnoreCase (string))
Omry Yadan

2
Penjelasan bermanfaat yang bagus. Terima kasih sudah bermain bagus.
james.garriss

@aioobe Saya pikir kami setuju? Kalau bisa lebih jelas, senang bisa edit.
Dean J

31
s == null

tidak akan berhasil?


4
@ k38: Anda "hanya" harus menggunakan equals()jika ingin membandingkan nilai . Tetapi jika Anda ingin memeriksa apakah suatu variabel null, Anda menggunakan ==.
Felix Kling

17

Yakin itu berhasil. Anda melewatkan bagian penting dari kode. Anda hanya perlu melakukan seperti ini:

boolean isNull = false;
try {
    stringname.equalsIgnoreCase(null);
} catch (NullPointerException npe) {
    isNull = true;
}

;)


24
Jika Anda membaca sejauh ini, harap sadari bahwa @aioobe sedang bercanda; Anda seharusnya tidak melakukannya dengan cara ini.
Dean J

12

Gunakan Metode TextUtils jika Anda bekerja di Android.

TextUtils.isEmpty (str) : Mengembalikan nilai true jika string adalah null atau 0-length. Parameter: str string yang akan diperiksa Returns: true jika str null atau panjangnya nol

  if(TextUtils.isEmpty(str)) {
        // str is null or lenght is 0
    }

Di bawah ini adalah kode sumber dari metode ini. Anda dapat menggunakan langsung.

 /**
     * Returns true if the string is null or 0-length.
     * @param str the string to be examined
     * @return true if str is null or zero length
     */
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.length() == 0)
            return true;
        else
            return false;
    }

5

Jika kita melihat implementasi metode equalsIgnoreCase, kita menemukan bagian ini:

if (string == null || count != string.count) {
    return false;
}

Jadi itu akan selalu kembali falsejika argumennya null. Dan ini jelas benar, karena satu-satunya kasus di mana ia harus kembali trueadalah ketika equalsIgnoreCase dipanggil pada null String, tapi

String nullString = null;
nullString.equalsIgnoreCase(null);

pasti akan menghasilkan NullPointerException.

Jadi metode yang sama tidak dirancang untuk menguji apakah suatu objek bernilai nol, hanya karena Anda tidak dapat memanggilnya null.


4

Ini terlihat agak aneh, tapi ...

stringName == null || "".equals(stringName)

Tidak pernah ada masalah melakukannya dengan cara ini, ditambah lagi ini adalah cara yang lebih aman untuk memeriksanya sambil menghindari potensi pengecualian titik nol.


waspadalah terhadap NullPointer dalam hal ini kondisi kedua harus menjadi yang pertama.
Pawan

3

Saya tidak yakin apa yang salah dengan jawaban The MYYN.

if (yourString != null) {
  //do fun stuff with yourString here
}

Pemeriksaan nol di atas cukup baik.

Jika Anda mencoba memeriksa apakah referensi String sama (mengabaikan kasus) ke string lain yang Anda tahu bukan referensi null, lakukan sesuatu seperti ini:

String x = "this is not a null reference"
if (x.equalsIgnoreCase(yourStringReferenceThatMightBeNull) ) {
  //do fun stuff
}

Jika ada keraguan apakah Anda memiliki referensi null untuk kedua String yang Anda bandingkan atau tidak, Anda harus memeriksa referensi null setidaknya pada salah satunya untuk menghindari kemungkinan NullPointerException.


2

Jika string Anda memiliki nilai "null" maka Anda dapat menggunakan

if(null == stringName){

  [code]

}

else

[Error Msg]

3
mengapa null == stringName dan bukan stringName == null? Saya berasumsi bahwa tidak ada perbedaan tetapi mengapa ini lebih disukai (dan saya sering melihatnya). Preferensi saya adalah membaca urutan LTR jadi stringName == null tetapi ingin tahu apa yang dipikirkan orang lain.
Lukasz 'Severiaan' Grela

7
biasanya sebagai perbandingan Anda meletakkan variabel di sisi kanan, sehingga Anda tidak akan menginisialisasi variabel pada kesalahan: null = stringName menghasilkan Kesalahan kompilasi sementara stringName = null akan dimungkinkan
Sarajog

4
Ini tidak "normal" untuk melakukan ini sama sekali dan banyak orang secara tegas melarangnya karena tidak secara alami dapat dibaca oleh seseorang yang membaca basis kode.
RichieHH

2

impor di kelas Anda

import org.apache.commons.lang.StringUtils;

lalu gunakan, keduanya akan mengembalikan true

System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(null)); 

2

Anda dapat memeriksa dengan String == null

Ini berhasil untuk saya

    String foo = null;
    if(foo == null){
        System.out.println("String is null");
    }

1

Tentu saja user351809, stringname.equalsignorecase(null)akan memunculkan NullPointerException.
Lihat, Anda memiliki objek string stringname, yang mengikuti 2 kemungkinan kondisi: -

  1. stringnamememiliki beberapa nilai string bukan nol (katakanlah "komputer"):
    Kode Anda akan berfungsi dengan baik saat mengambil formulir
    "computer".equalsignorecase(null)
    dan Anda mendapatkan respons yang diharapkan sebagai false.
  2. stringnamememiliki nullnilai:
    Di sini kode Anda akan macet, karena
    null.equalsignorecase(null)
    Bagaimanapun, tampak bagus pada tampilan pertama dan Anda mungkin berharap respons sebagai true,
    tetapi, nullbukan objek yang dapat menjalankan equalsignorecase()metode ini.

Oleh karena itu, Anda mendapatkan pengecualian karena kasus 2.
Yang saya sarankan adalah gunakan sajastringname == null


1

Metode sederhana:

public static boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

1

Jika yang valuedikembalikan null, gunakan:

if(value.isEmpty());

Kadang-kadang untuk memeriksa null, if(value == null)di java, itu mungkin tidak memberikan true bahkan String adalah null.


1
Menggunakan Scala (dengan Java) if(value.isEmpty())memberikan NullPointerException. Dalam hal ini lebih baik menggunakanif(value == null)
Andrea

Ini jelas salah karena akan selalu membuang NPE jika nol.
Roger

1

Dengan Java 7 Anda dapat menggunakan

if (Objects.equals(foo, null)) {
    ...
}

yang akan dikembalikan truejika kedua parameter tersebut null.


0

Saya menyadari ini telah dijawab sejak lama, tetapi saya belum melihat ini diposting, jadi saya pikir saya akan membagikan apa yang saya lakukan. Ini tidak terlalu baik untuk keterbacaan kode, tetapi jika Anda harus melakukan serangkaian pemeriksaan nol, saya suka menggunakan:

String someString = someObject.getProperty() == null ? "" : someObject.getProperty().trim();

Dalam contoh ini, trim dipanggil pada string, yang akan melempar NPE jika string itu nol atau spasi, tetapi pada baris yang sama, Anda dapat memeriksa null atau kosong sehingga Anda tidak berakhir dengan satu ton (lebih ) sulit untuk memformat jika blok.


Apa maksud Anda memeriksa kosong atau kosong? Anda hanya memeriksa nol di sini. Kosong adalah salah satu kemungkinan hasil dari "COND? A: B;" membangun, bukan?
philo vivero

0

Jika saya mengerti dengan benar, ini harus dilakukan:

if(!stringname.isEmpty())
// an if to check if stringname is not null
if(stringname.isEmpty())
// an if to check if stringname is null

-2

Nah, terakhir kali seseorang menanyakan pertanyaan konyol ini, jawabannya adalah:

someString.equals("null")

"Perbaikan" ini hanya menyembunyikan masalah yang lebih besar tentang bagaimana nullmenjadi "null"di tempat pertama.


Tidak - jadi ini bukan perbaikan dan bukan jawaban yang berguna.
Chris Stratton

Saya ingin menjadi orang pertama yang mengatakan: "wat"
philo vivero

ini tidak menjawab pertanyaan
jason adams

-2

Ada dua cara untuk melakukannya..Katakan String == null atau string.equals () ..

public class IfElse {

    public int ifElseTesting(String a){
        //return null;
        return (a== null)? 0: a.length();
    }

}

public class ShortCutifElseTesting {

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        System.out.println("enter the string please:");
        String a=scanner.nextLine();
        /*
        if (a.equals(null)){
            System.out.println("you are not correct");
        }
        else if(a.equals("bangladesh")){
            System.out.println("you are right");
        }
        else
            System.out.println("succesful tested");

        */
        IfElse ie=new IfElse();
        int result=ie.ifElseTesting(a);
        System.out.println(result);

    }

}

Periksa contoh ini..Berikut adalah contoh lain dari versi pintasan If Else ..


1
Tidak! .equals () tidak boleh digunakan dengan objek yang berpotensi null, jadi penjelasan pengantar salah. Dan sisa dari jawaban ini tampaknya tidak berguna dan tidak berhubungan dengan pertanyaan yang diajukan.
Chris Stratton
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.