จะตรวจสอบสตริงกับ null ใน java ได้อย่างไร?


คำตอบ:


164

string == nullเปรียบเทียบว่าวัตถุเป็นโมฆะหรือไม่ string.equals("foo")เปรียบเทียบค่าภายในของวัตถุนั้น string == "foo"ไม่ได้ผลเสมอไปเพราะคุณกำลังพยายามดูว่าวัตถุเหมือนกันหรือไม่ไม่ใช่ค่าที่แสดง


คำตอบอีกต่อไป:

หากคุณลองสิ่งนี้จะไม่ได้ผลดังที่คุณพบ:

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

เหตุผลก็คือ foo เป็นโมฆะจึงไม่รู้ว่า. equals คืออะไร; ไม่มีวัตถุสำหรับ. เท่ากับที่จะเรียกจาก.

สิ่งที่คุณอาจต้องการคือ:

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

วิธีทั่วไปในการป้องกันตัวเองจากโมฆะเมื่อจัดการกับ Strings คือ:

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

ด้วยวิธีนี้ถ้า foo เป็นโมฆะมันจะไม่ประเมินครึ่งหลังของเงื่อนไขและทุกอย่างก็ถูกต้อง

วิธีง่ายๆหากคุณใช้ String literal (แทนตัวแปร) คือ:

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

หากคุณต้องการหลีกเลี่ยงสิ่งนั้น Apache Commons มีคลาส - StringUtils - ที่ให้การดำเนินการกับสตริงที่ปลอดภัย

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

อีกคำตอบคือล้อเล่นและบอกว่าคุณควรทำสิ่งนี้:

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

กรุณาอย่าทำอย่างนั้น คุณควรโยนข้อยกเว้นสำหรับข้อผิดพลาดที่พิเศษเท่านั้น หากคุณคาดหวังว่าค่าว่างคุณควรตรวจสอบล่วงหน้าและอย่าปล่อยให้เกิดข้อยกเว้น

ในหัวของฉันมีสองเหตุผลสำหรับเรื่องนี้ ประการแรกข้อยกเว้นช้า การตรวจสอบค่า null นั้นรวดเร็ว แต่เมื่อ JVM แสดงข้อยกเว้นต้องใช้เวลามาก ประการที่สองโค้ดจะอ่านและดูแลรักษาง่ายกว่ามากหากคุณตรวจสอบตัวชี้ค่าว่างล่วงหน้า


2
คุณพลาดรุ่น Yoda และใช้งานได้ทุกครั้ง: if ("foo" .equalsIgnoreCase (string))
Omry Yadan

2
คำอธิบายที่เป็นประโยชน์ดี ขอบคุณสำหรับการเล่นที่ดี
james.garriss

@aioobe ฉันคิดว่าเราเห็นด้วย? หากคุณสามารถชัดเจนมากขึ้นยินดีที่จะแก้ไข
Dean J

31
s == null

จะไม่ทำงาน?


4
@ K38: คุณ "เท่านั้น" ต้องใช้equals()ถ้าคุณต้องการที่จะเปรียบเทียบค่า แต่ถ้าคุณต้องการที่จะตรวจสอบว่าตัวแปรคือคุณสามารถใช้null ==
Felix Kling

17

แน่นอนว่าได้ผล คุณพลาดส่วนสำคัญของโค้ด คุณต้องทำดังนี้:

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

;)


24
หากคุณอ่านมาจนถึงตอนนี้โปรดทราบว่า @aioobe ล้อเล่น คุณไม่ควรทำแบบนี้
Dean J

12

ใช้ TextUtils Method ถ้าคุณทำงานใน Android

TextUtils.isEmpty (str) : ส่งคืนจริงถ้าสตริงเป็นค่าว่างหรือความยาว 0 พารามิเตอร์: str สตริงที่จะตรวจสอบ Returns: true ถ้า str เป็นค่าว่างหรือความยาวเป็นศูนย์

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

ด้านล่างนี้คือซอร์สโค้ดของวิธีนี้คุณสามารถใช้ Direclty

 /**
     * 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 เราจะพบว่าส่วนนี้:

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

ดังนั้นจึงมักจะกลับถ้าอาร์กิวเมนต์เป็นfalse nullและเห็นได้ชัดว่านี่เป็นสิ่งที่ถูกต้องเพราะกรณีเดียวที่ควรส่งคืนtrueคือเมื่อเรียกใช้ equalsIgnoreCase บน a null Stringแต่

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

จะส่งผลให้เกิด NullPointerException อย่างแน่นอน

ดังนั้นวิธีการเท่ากับไม่ได้ออกแบบมาเพื่อทดสอบว่าวัตถุเป็นโมฆะเพียงเพราะคุณไม่สามารถเรียกใช้งานnullได้


4

มันดูแปลก ๆ แต่ ...

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

ไม่เคยมีปัญหาใด ๆ ในการทำเช่นนี้เลยแถมยังเป็นวิธีตรวจสอบที่ปลอดภัยกว่าในขณะที่หลีกเลี่ยงข้อยกเว้นจุดว่างที่อาจเกิดขึ้น


ระวัง NullPointer ในกรณีนี้เงื่อนไขที่สองควรเป็นอันดับแรก
Pawan

3

ฉันไม่แน่ใจว่าเกิดอะไรขึ้นกับคำตอบของ The MYYN

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

การตรวจสอบค่าว่างข้างต้นไม่เป็นไร

หากคุณกำลังพยายามตรวจสอบว่าการอ้างอิงสตริงเท่ากันหรือไม่ (โดยไม่สนใจตัวพิมพ์เล็กและใหญ่) กับสตริงอื่นที่คุณรู้ว่าไม่ใช่การอ้างอิงที่เป็นโมฆะให้ทำสิ่งนี้:

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

หากมีข้อสงสัยว่าคุณมีการอ้างอิงว่างสำหรับทั้งสองสตริงที่คุณกำลังเปรียบเทียบหรือไม่คุณจะต้องตรวจสอบการอ้างอิงที่เป็นโมฆะอย่างน้อยหนึ่งรายการเพื่อหลีกเลี่ยงความเป็นไปได้ของ NullPointerException


2

หากสตริงของคุณมีค่า "null" คุณสามารถใช้

if(null == stringName){

  [code]

}

else

[Error Msg]

3
ทำไม null == stringName และไม่ใช่ stringName == null? ฉันคิดว่าไม่มีความแตกต่าง แต่เหตุใดจึงเป็นที่ต้องการ (และฉันเห็นมามากแล้ว) ความชอบของฉันคือการอ่านคำสั่ง LTR ดังนั้น stringName == null แต่อยากรู้ว่าคนอื่นคิดอย่างไร
Lukasz 'Severiaan' Grela

7
โดยปกติในการเปรียบเทียบคุณใส่ตัวแปรทางด้านขวาเพื่อที่คุณจะไม่เริ่มต้นตัวแปรโดยผิดพลาด: null = stringName สร้างข้อผิดพลาดในการคอมไพล์ในขณะที่ stringName = null จะเป็นไปได้
Sarajog

4
ไม่ใช่เรื่อง "ปกติ" ที่จะทำเช่นนี้และหลายคนก็ห้ามอย่างชัดแจ้งเนื่องจากไม่สามารถอ่านได้โดยธรรมชาติสำหรับคนที่อ่านรหัส
RichieHH

2

นำเข้าในชั้นเรียนของคุณ

import org.apache.commons.lang.StringUtils;

จากนั้นใช้มันทั้งสองจะกลับมาเป็นจริง

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


1

แน่นอน user351809 stringname.equalsignorecase(null)จะโยน NullPointerException
ดูคุณมีวัตถุสตริงstringnameซึ่งเป็นไปตามเงื่อนไขที่เป็นไปได้ 2 เงื่อนไข: -

  1. stringnameมีบางค่าที่ไม่ใช่ null สตริง (พูดว่า "คอมพิวเตอร์"):
    รหัสของคุณจะทำงานได้ดีก็จะเป็นรูปแบบและคุณได้รับการตอบสนองที่คาดว่าจะเป็น
    "computer".equalsignorecase(null)
    false
  2. stringnameมีnullความคุ้มค่า:
    นี่คือรหัสของคุณจะได้รับการติดเป็น
    null.equalsignorecase(null)
    อย่างไรก็ตามดูเหมือนว่าดีที่ดูครั้งแรกและคุณอาจหวังว่าการตอบสนองเป็นtrue,
    แต่nullไม่ได้เป็นวัตถุที่สามารถดำเนินการตามequalsignorecase()วิธีการ

ดังนั้นคุณจะได้รับข้อยกเว้นเนื่องจากกรณีที่ 2
สิ่งที่ฉันแนะนำให้คุณใช้คือเพียงแค่ใช้stringname == null



1

หากสิ่งที่valueส่งคืนเป็นค่าว่างให้ใช้:

if(value.isEmpty());

บางครั้งในการตรวจสอบ null if(value == null)ใน java มันอาจไม่ให้ true แม้ว่า String จะเป็นโมฆะ


1
การใช้สกาลา (กับ Java) จะช่วยให้if(value.isEmpty()) NullPointerExceptionในกรณีนี้ดีกว่าโดยใช้if(value == null)
Andrea

นี่เป็นสิ่งที่ผิดอย่างแน่นอนเพราะมันจะโยน NPE เสมอหากเป็นโมฆะ
Roger

1

ด้วย Java 7 คุณสามารถใช้

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

ซึ่งจะกลับมาถ้าพารามิเตอร์ทั้งสองtruenull


0

ฉันรู้ว่ามีคำตอบนานแล้ว แต่ฉันไม่เห็นโพสต์นี้จึงคิดว่าจะแบ่งปันสิ่งที่ฉันทำ สิ่งนี้ไม่ดีอย่างยิ่งสำหรับความสามารถในการอ่านโค้ด แต่ถ้าคุณต้องทำการตรวจสอบค่าว่างฉันชอบใช้:

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

ในตัวอย่างนี้การตัดแต่งเรียกว่าสตริงซึ่งจะส่ง NPE หากสตริงเป็นโมฆะหรือช่องว่าง แต่ในบรรทัดเดียวกันคุณสามารถตรวจสอบค่าว่างหรือว่างเพื่อที่คุณจะได้ไม่ต้องลงท้ายด้วยจำนวนตัน (more ) ยากที่จะจัดรูปแบบหากบล็อก


คุณหมายถึงการตรวจสอบค่าว่างหรือค่าว่าง? คุณกำลังตรวจสอบค่าว่างที่นี่เท่านั้น ช่องว่างเป็นหนึ่งในผลตอบแทนที่เป็นไปได้ของ "COND? A: B;" สร้างใช่ไหม
philo vivero

0

ถ้าฉันเข้าใจถูกต้องสิ่งนี้ควรทำ:

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

-2

ครั้งสุดท้ายที่มีคนถามคำถามโง่ ๆ คำตอบคือ:

someString.equals("null")

"การแก้ไข" นี้เป็นเพียงการซ่อนปัญหาที่ใหญ่กว่าว่าnullจะเกิดขึ้นได้อย่างไร"null"ในตอนแรก


ไม่เป็นเช่นนั้นนี่ไม่ใช่วิธีแก้ไขและไม่ใช่คำตอบที่มีประโยชน์
Chris Stratton

ขอเป็นคนแรกที่พูดว่า: "wat"
philo vivero

สิ่งนี้ไม่ตอบคำถาม
jason adams

-2

มีสองวิธีในการทำ .. Say String == nullหรือ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);

    }

}

ตรวจสอบตัวอย่างนี้ .. นี่คืออีกตัวอย่างหนึ่งของเวอร์ชันทางลัดของ If Else ..


1
ไม่! ต้องไม่ใช้ .equals () กับอ็อบเจ็กต์ที่อาจเป็นโมฆะดังนั้นคำอธิบายเบื้องต้นจึงผิดพลาด และส่วนที่เหลือของคำตอบนี้ดูเหมือนจะไม่มีจุดหมายและไม่เกี่ยวข้องกับคำถามที่ถาม
Chris Stratton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.