Làm thế nào để kiểm tra một chuỗi so với null trong java?


92

Làm cách nào để kiểm tra một chuỗi so với null trong java? tôi đang dùng

stringname.equalsignorecase(null)

nhưng nó không hoạt động.

Câu trả lời:


163

string == nullso sánh nếu đối tượng là null. string.equals("foo")so sánh giá trị bên trong của đối tượng đó. string == "foo"không phải lúc nào cũng hoạt động, bởi vì bạn đang cố gắng xem các đối tượng có giống nhau không, không phải giá trị mà chúng đại diện.


Câu trả lời dài hơn:

Nếu bạn thử điều này, nó sẽ không hoạt động, như bạn đã tìm thấy:

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

Lý do là foo là null nên nó không biết .equals là gì; không có đối tượng nào ở đó cho .equals được gọi từ.

Những gì bạn có thể muốn là:

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

Cách điển hình để bảo vệ bạn khỏi null khi xử lý các Chuỗi là:

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

Bằng cách đó, nếu foo là null, nó không đánh giá nửa sau của điều kiện và mọi thứ đều ổn.

Cách dễ dàng, nếu bạn đang sử dụng chuỗi ký tự (thay vì một biến), là:

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

Nếu bạn muốn giải quyết vấn đề đó, Apache Commons có một lớp - StringUtils - cung cấp các hoạt động Chuỗi không an toàn.

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

Một phản hồi khác là đùa cợt và nói rằng bạn nên làm điều này:

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

Xin đừng làm vậy. Bạn chỉ nên ném các ngoại lệ cho các lỗi đặc biệt; nếu bạn đang mong đợi một null, bạn nên kiểm tra nó trước thời hạn và không để nó ném ra ngoại lệ.

Trong đầu tôi, có hai lý do cho việc này. Đầu tiên, các ngoại lệ chậm; kiểm tra so với null rất nhanh, nhưng khi JVM ném một ngoại lệ, nó mất rất nhiều thời gian. Thứ hai, mã dễ đọc và dễ bảo trì hơn nhiều nếu bạn chỉ kiểm tra con trỏ null trước thời hạn.


2
bạn đã bỏ lỡ phiên bản Yoda, cũng hoạt động mọi lúc: if ("foo" .equalsIgnoreCase (string))
Omry Yadan

2
Giải thích hữu ích tốt đẹp. Cảm ơn vì đã chơi tốt.
james.garriss 12/09/12

@aioobe Tôi nghĩ chúng ta đồng ý? Nếu bạn có thể rõ ràng hơn, vui lòng chỉnh sửa.
Dean J

31
s == null

sẽ không hoạt động?


4
@ k38: Bạn "chỉ" phải sử dụng equals()nếu bạn muốn so sánh các giá trị . Nhưng nếu bạn muốn kiểm tra xem một biến có null, bạn sử dụng ==.
Felix Kling

18

Chắc chắn nó hoạt động. Bạn đang bỏ lỡ một phần quan trọng của mã. Bạn chỉ cần làm như sau:

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

;)


23
Nếu bạn đã đọc đến đây, hãy nhận ra rằng @aioobe đang nói đùa; bạn không nên làm theo cách này.
Dean J

12

Sử dụng Phương pháp TextUtils nếu bạn đang làm việc trong Android.

TextUtils.isEmpty (str) : Trả về true nếu chuỗi là null hoặc 0-length. Tham số: str chuỗi được kiểm tra Trả về: true nếu str có độ dài rỗng hoặc bằng 0

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

Dưới đây là mã nguồn của phương pháp này, bạn có thể sử dụng trực tiếp.

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

Nếu chúng ta xem xét việc triển khai phương thức equalsIgnoreCase, chúng ta thấy phần này:

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

Vì vậy, nó sẽ luôn trả về falsenếu đối số là null. Và điều này rõ ràng là đúng, bởi vì trường hợp duy nhất mà nó sẽ trả về truelà khi equalsIgnoreCase được gọi trên một null String, nhưng

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

chắc chắn sẽ dẫn đến một NullPointerException.

Vì vậy, các phương thức bằng không được thiết kế để kiểm tra xem một đối tượng có rỗng hay không, chỉ vì bạn không thể gọi chúng trên đó null.


4

Điều này trông hơi lạ, nhưng ...

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

Không bao giờ có bất kỳ sự cố nào khi thực hiện theo cách này, cộng với đó là một cách an toàn hơn để kiểm tra trong khi tránh các ngoại lệ điểm rỗng tiềm ẩn.


hãy cẩn thận với NullPointer trong trường hợp này, điều kiện thứ hai phải là đầu tiên.
Pawan

3

Tôi không chắc câu trả lời của The MYYN đã sai ở điểm nào.

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

Kiểm tra null ở trên là khá ổn.

Nếu bạn đang cố gắng kiểm tra xem một tham chiếu Chuỗi có bằng (bỏ qua chữ hoa chữ thường) với một chuỗi khác mà bạn biết không phải là tham chiếu rỗng hay không, thì hãy làm như sau:

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

Nếu có bất kỳ nghi ngờ nào về việc bạn có tham chiếu null cho cả hai Chuỗi mà bạn đang so sánh hay không, bạn sẽ cần kiểm tra tham chiếu null trên ít nhất một trong số chúng để tránh khả năng xảy ra NullPointerException.


2

Nếu chuỗi của bạn có giá trị "null" thì bạn có thể sử dụng

if(null == stringName){

  [code]

}

else

[Error Msg]

3
tại sao null == stringName mà không phải stringName == null? Tôi cho rằng không có sự khác biệt nhưng tại sao điều này lại được ưa thích (và tôi đã thấy nó rất nhiều). Sở thích của tôi là đọc lệnh LTR nên stringName == null nhưng muốn biết người khác nghĩ gì.
Lukasz 'Severiaan' Grela 13/09/13

7
thường so bạn đặt biến ở phía bên phải, do đó bạn sẽ không khởi tạo biến trên sai lầm: null = stringName tạo ra một lỗi biên dịch trong khi stringName = null sẽ có thể
Sarajog

4
Làm điều này không "bình thường" chút nào và nhiều người rõ ràng cấm nó vì nó không tự nhiên có thể đọc được đối với người đọc cơ sở mã.
RichieHH

2

nhập nó trong lớp của bạn

import org.apache.commons.lang.StringUtils;

sau đó sử dụng nó, cả hai đều sẽ trả về true

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

2

Bạn có thể kiểm tra bằng String == null

Điều này phù hợp với tôi

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

1

Tất nhiên user351809, stringname.equalsignorecase(null)sẽ ném NullPointerException.
Hãy xem, bạn có một đối tượng chuỗi stringnametuân theo 2 điều kiện có thể có: -

  1. stringnamecó một số giá trị chuỗi không rỗng (giả sử "máy tính"):
    Mã của bạn sẽ hoạt động tốt khi nó có dạng
    "computer".equalsignorecase(null)
    và bạn nhận được phản hồi như mong đợi false.
  2. stringnamenullgiá trị:
    Ở đây mã của bạn sẽ bị kẹt, vì
    null.equalsignorecase(null)
    Tuy nhiên, thoạt nhìn có vẻ tốt và bạn có thể hy vọng phản hồi là true,
    nhưng, nullkhông phải là một đối tượng có thể thực thi equalsignorecase()phương thức.

Do đó, bạn có được ngoại lệ do trường hợp 2.
Điều tôi đề nghị bạn chỉ cần sử dụngstringname == null


1

Phương pháp đơn giản:

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

1

Nếu kết quả valuetrả về là null, hãy sử dụng:

if(value.isEmpty());

Đôi khi để kiểm tra null, if(value == null)trong java, nó có thể không cho true ngay cả khi Chuỗi là null.


1
Sử dụng Scala (với Java) if(value.isEmpty())mang lại NullPointerException. Trong trường hợp này thì tốt hơn nên sử dụngif(value == null)
Andrea

Điều này chắc chắn là sai vì nó sẽ luôn ném NPE nếu null.
Roger

1

Với Java 7, bạn có thể sử dụng

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

sẽ trả về truenếu cả hai tham số null.


0

Tôi nhận ra điều này đã được trả lời từ lâu, nhưng tôi chưa thấy bài đăng này được đăng, vì vậy tôi nghĩ tôi sẽ chia sẻ những gì tôi làm. Điều này không đặc biệt tốt cho khả năng đọc mã, nhưng nếu bạn phải thực hiện một loạt các kiểm tra rỗng, tôi muốn sử dụng:

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

Trong ví dụ này, trim được gọi trên chuỗi, sẽ ném ra một NPE nếu chuỗi là null hoặc khoảng trắng, nhưng trên cùng một dòng, bạn có thể kiểm tra null hoặc trống để bạn không kết thúc với một tấn (hơn ) khó định dạng nếu khối.


Ý bạn là gì kiểm tra null hay trống? Bạn chỉ kiểm tra null ở đây. Khoảng trống là một trong những giá trị trả về có thể có của "COND? A: B;" xây dựng, phải không?
philo vivero

0

Nếu tôi hiểu đúng, điều này nên làm:

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

-2

Chà, lần cuối cùng ai đó hỏi câu hỏi ngớ ngẩn này, câu trả lời là:

someString.equals("null")

Tuy nhiên, "sửa chữa" này chỉ che giấu vấn đề lớn hơn là làm thế nào để nulltrở thành "null"ngay từ đầu.


Nó không - vì vậy đây không phải là một sửa chữa và không phải là một câu trả lời hữu ích.
Chris Stratton

Tôi muốn là người đầu tiên nói: "wat"
philo Vivero

điều này không trả lời câu hỏi
jason adams

-2

Có hai cách để thực hiện điều đó..Say String == null hoặc 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);

    }

}

Kiểm tra ví dụ này..Đây là một ví dụ khác về phiên bản phím tắt của If Else ..


1
Không! .equals () không được sử dụng với đối tượng có khả năng là rỗng, do đó, phần giải thích giới thiệu bị nhầm lẫn. Và phần còn lại của câu trả lời này dường như vô nghĩa và không liên quan đến câu hỏi được đặt ra.
Chris Stratton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.