Java'da bir dizge null değerine göre nasıl kontrol edilir?


93

Java'da bir dizeyi null değerine göre nasıl kontrol edebilirim? Ben kullanıyorum

stringname.equalsignorecase(null)

ama işe yaramıyor.

Yanıtlar:


165

string == nullnesnenin boş olup olmadığını karşılaştırır. string.equals("foo")o nesnenin içindeki değeri karşılaştırır. string == "foo"her zaman işe yaramaz, çünkü nesnelerin temsil ettikleri değerlerin değil aynı olup olmadığını görmeye çalışıyorsunuz.


Daha uzun cevap:

Bunu denerseniz, bulduğunuz gibi işe yaramaz:

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

Bunun nedeni, foo'nun null olması, dolayısıyla .equals'ın ne olduğunu bilmemesidir; Eşit değerlerin çağrılabileceği bir nesne yoktur.

Muhtemelen istediğin şey şuydu:

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

Strings ile uğraşırken kendinizi boşa karşı korumanın tipik yolu şudur:

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

Bu şekilde, eğer foo boşsa, koşulun ikinci yarısını değerlendirmez ve her şey yolunda gider.

Bir String değişmezi kullanıyorsanız (değişken yerine) kolay yol şudur:

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

Bu konuda çalışmak istiyorsanız, Apache Commons'ın sıfır güvenli String işlemleri sağlayan bir StringUtils sınıfı vardır .

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

Başka bir cevap şakaydı ve bunu yapman gerektiğini söyledi:

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

Lütfen bunu yapma. Yalnızca istisnai hatalar için istisnalar atmalısınız; Boşluk bekliyorsanız, vaktinden önce kontrol etmeli ve istisnayı atmasına izin vermemelisiniz.

Kafamda bunun iki nedeni var. İlk olarak, istisnalar yavaştır; null değerine karşı denetim hızlıdır, ancak JVM bir istisna attığında, çok zaman alır. İkinci olarak, önceden boş göstericiyi kontrol ederseniz, kodun okunması ve bakımı çok daha kolaydır.


2
Yoda sürümünü kaçırdınız, her seferinde de çalışır: if ("foo" .equalsIgnoreCase (string))
Omry Yadan

2
Güzel faydalı açıklama. İyi oynadığın için teşekkürler.
james.garriss

@aioobe Sanırım katılıyor muyuz? Daha net olabilirseniz, düzenlemekten memnuniyet duyarız.
Dean J

31
s == null

çalışmayacak mı?


4
@ k38: Değerleriequals() karşılaştırmak istiyorsanız "yalnızca" kullanmanız gerekir . Ancak bir değişkenin olup olmadığını kontrol etmek istiyorsanız , kullanırsınız . null==
Felix Kling

18

Elbette işe yarıyor. Kodun hayati bir parçasını kaçırıyorsunuz. Sadece şunu yapman gerekiyor:

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

;)


25
Buraya kadar okuduysanız, lütfen @aioobe'nin şaka yaptığını unutmayın; bu şekilde yapmamalısın.
Dean J

12

Android'de çalışıyorsanız TextUtils Yöntemini kullanın.

TextUtils.isEmpty (str) : Dize null veya 0-uzunlukluysa doğru döndürür. Parametreler: str incelenecek dizge Döndürür: str null veya sıfır uzunlukta ise true

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

Aşağıda ise kaynak kod direclty kullanabileceğiniz bu method.You ait.

 /**
     * 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

EqualsIgnoreCase yönteminin uygulanmasına bakarsak, bu bölümü buluyoruz:

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

Yani falseargüman ise her zaman geri dönecektir null. Ve bu kesinlikle doğrudur, çünkü dönmesi gereken tek durum true, equalsIgnoreCase'in a üzerinde çağrıldığı durumdur null String, ancak

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

kesinlikle bir NullPointerException ile sonuçlanacaktır.

Yani eşittir yöntemleri, bir nesnenin boş olup olmadığını test etmek için tasarlanmamıştır, çünkü onları çağıramazsınız null.


4

Bu biraz tuhaf görünüyor ama ...

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

Bunu bu şekilde yaparken hiçbir zaman sorun yaşamadım, ayrıca potansiyel boş nokta istisnalarından kaçınırken kontrol etmenin daha güvenli bir yoludur.


Bu durumda NullPointer'a dikkat edin, ikinci koşul ilk olmalıdır.
Pawan

3

MYYN'nin cevabında neyin yanlış olduğundan emin değilim.

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

Yukarıdaki boş kontrol oldukça uygundur.

Bir String referansının boş bir referans olmadığını bildiğiniz başka bir dizeye eşit olup olmadığını (büyük / küçük harfleri yok sayarak) kontrol etmeye çalışıyorsanız , o zaman şöyle bir şey yapın:

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

Karşılaştırdığınız her iki Dizge için boş referanslarınız olup olmadığına dair herhangi bir şüpheniz varsa, NullPointerException olasılığını önlemek için bunlardan en az birinde boş bir referans olup olmadığını kontrol etmeniz gerekir.


2

Dizeniz "null" değerine sahipse, kullanabilirsiniz

if(null == stringName){

  [code]

}

else

[Error Msg]

3
neden null == stringName ve stringName == null değil? Sanırım fark yok ama neden tercih ediliyor (ve bunu çok gördüm). Tercihim LTR sırasını okumak, yani stringName == null ama diğer insanların ne düşündüğünü bilmek istiyorum.
Lukasz 'Severiaan' Grela

7
normalde buna kıyasla değişkeni sağ tarafa koyarsınız, böylece değişkeni yanlışlıkla başlatmazsınız: null = stringName bir derleme hatası üretirken stringName = null mümkün olabilir
Sarajog

4
Bunu yapmak "normal" değildir ve kod tabanını okuyan biri tarafından doğal olarak okunamayacağı için birçok kişi bunu açıkça yasaklar.
RichieHH

2

sınıfına aktar

import org.apache.commons.lang.StringUtils;

sonra kullan, ikisi de doğru dönecek

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

2

String == null ile kontrol edebilirsiniz

Bu benim için çalışıyor

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

1

Elbette user351809, stringname.equalsignorecase(null)NullPointerException oluşturacaktır.
Bakın, stringnameolası 2 koşulu izleyen bir string nesneniz var : -

  1. stringnameboş olmayan bir dize değerine sahip (örneğin "bilgisayar"):
    Kodunuz, formu alırken düzgün çalışacak
    "computer".equalsignorecase(null)
    ve beklenen yanıtı şu şekilde alacaksınız:false .
  2. stringnamebir nulldeğeri vardır:
    Burada kodunuz sıkışacaktır,
    null.equalsignorecase(null)
    ancak ilk bakışta iyi görünür ve yanıt almayı umabilirsiniz true,
    ancak yöntemi nulluygulayabilecek bir nesne değildir equalsignorecase().

Bu nedenle, 2. durum nedeniyle istisna elde edersiniz.
Size önerdiğim şey,stringname == null


1

Basit yöntem:

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

1

Eğer valueiade null, kullanımıdır:

if(value.isEmpty());

Bazen java'da null kontrol etmek if(value == null), String null olsa bile doğru vermeyebilir.


1
Scala kullanmak (Java ile) if(value.isEmpty())verir NullPointerException. Bu durumda kullanmak daha iyidirif(value == null)
Andrea

Bu kesinlikle yanlıştır çünkü null ise her zaman NPE atar.
Roger

1

Java 7 ile kullanabilirsiniz

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

trueher iki parametrenin de olması durumunda döndürülür null.


0

Bunun uzun zaman önce yanıtlandığını fark ettim, ancak bunun yayınlandığını görmedim, bu yüzden yaptığımı paylaşacağımı düşündüm. Bu özellikle kod okunabilirliği için iyi değildir, ancak bir dizi boş kontrol yapmak zorunda kalırsanız, şunu kullanmayı severim:

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

Bu örnekte, dize null veya boşluk olsaydı bir NPE atacak olan trim çağrılır, ancak aynı satırda, bir ton (daha fazlası ) bloklar ise biçimlendirmek zordur.


Boş veya boş kontrol etmek ne demek? Burada sadece boşluğu kontrol ediyorsunuz. Boş, "COND? A: B;" nin olası getirilerinden biridir. inşa, değil mi?
philo vivero

0

Doğru anladıysam, bunu yapmalı:

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

-2

En son birisi bu saçma soruyu sorduğunda cevap şuydu:

someString.equals("null")

Bu "düzeltme" sadece nasıl daha büyük bir sorun gizler nullhale "null"olsa da, ilk etapta.


Öyle değil - yani bu bir düzeltme değil ve kullanışlı bir yanıt değil.
Chris Stratton

İlk söyleyen ben olmak istiyorum: "wat"
philo vivero

bu soruya cevap vermiyor
jason adams

-2

Bunu yapmanın iki yolu vardır .. Dize == null veya 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);

    }

}

Bu örneğe bakın ... İşte If Else'in kısayol sürümünün başka bir örneği.


1
Hayır! .equals () potansiyel olarak boş bir nesneyle kullanılmamalıdır, bu nedenle giriş açıklaması yanlıştır. Ve bu cevabın geri kalanı anlamsız ve sorulan soruyla alakasız görünüyor.
Chris Stratton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.