Java에서 null에 대해 문자열을 확인하는 방법은 무엇입니까?


92

Java에서 null에 대해 문자열을 어떻게 확인할 수 있습니까? 나는 사용하고있다

stringname.equalsignorecase(null)

하지만 작동하지 않습니다.

답변:


163

string == null객체가 null인지 비교합니다. string.equals("foo")해당 객체 내부의 값을 비교합니다. string == "foo"항상 작동하지는 않습니다. 객체가 나타내는 값이 아니라 객체가 동일한 지 확인하려고하기 때문입니다.


더 긴 답변 :

이것을 시도하면 다음과 같이 작동하지 않습니다.

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

그 이유는 foo가 null이므로 .equals가 무엇인지 알지 못하기 때문입니다. .equals를 호출 할 개체가 없습니다.

당신이 원했던 것은 :

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

문자열을 처리 할 때 null에 대해 자신을 보호하는 일반적인 방법은 다음과 같습니다.

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

이렇게하면 foo가 null이면 조건부의 후반부를 평가하지 않고 모든 것이 정상입니다.

변수 대신 문자열 리터럴을 사용하는 경우 쉬운 방법은 다음과 같습니다.

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

이 문제를 해결하려면 Apache Commons에 null-safe String 작업을 제공하는 StringUtils 클래스가 있습니다.

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

또 다른 응답은 농담이며 이렇게해야한다고 말했습니다.

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

그러지 마세요. 예외적 인 오류에 대해서만 예외를 발생시켜야합니다. null이 예상되는 경우 미리 확인하고 예외가 발생하지 않도록해야합니다.

제 머릿속에는 두 가지 이유가 있습니다. 첫째, 예외는 느립니다. 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

18

물론 작동합니다. 코드의 중요한 부분을 놓치고 있습니다. 다음과 같이하면됩니다.

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

;)


23
여기까지 읽으 셨다면 @aioobe가 농담임을 깨달으십시오. 이런 식으로하면 안됩니다.
Dean J

12

Android에서 작업하는 경우 TextUtils 메서드를 사용하십시오.

TextUtils.isEmpty (str) : 문자열이 null이거나 길이가 0이면 true를 반환합니다. 매개 변수 : str 검사 할 문자열 반환 값 : str이 null이거나 길이가 0 인 경우 true

  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. 그것은 반환해야하는 유일한 경우가 있기 때문에이 분명히 맞다 trueequalsIgnoreCase가에서 호출 할 때입니다 null String만,

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

확실히 NullPointerException이 발생합니다.

따라서 equals 메서드는에서 호출 할 수 없기 때문에 객체가 null인지 여부를 테스트하도록 설계되지 않았습니다 null.


4

좀 이상해 보이지만 ...

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

이런 방식으로 문제가 발생하지 않았으며 잠재적 인 null 포인트 예외를 피하면서 더 안전한 방법으로 확인할 수 있습니다.


이 경우 NullPointer에주의하십시오.이 경우 두 번째 조건이 첫 번째 여야합니다.
Pawan

3

The MYYN의 답변에 무엇이 잘못되었는지 잘 모르겠습니다.

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

위의 null 검사는 괜찮습니다.

당신이 문자열 참조하면 또 다른 문자열과 동일 (무시하는 경우)인지 확인하려는 경우 알고 널 참조되어 있지 않은 경우, 같은 것을 할 :

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

비교중인 두 문자열에 대해 null 참조가 있는지 여부에 대해 의심이가는 경우 NullPointerException의 가능성을 피하기 위해 둘 중 하나 이상에서 null 참조를 확인해야합니다.


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 2014 년

2

수업에서 가져와

import org.apache.commons.lang.StringUtils;

그런 다음 사용하면 둘 다 true를 반환합니다.

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

2

String == null로 확인할 수 있습니다.

이것은 나를 위해 작동합니다

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

1

물론 user351809 stringname.equalsignorecase(null)는 NullPointerException을 발생시킵니다. 두 가지 가능한 조건을 따르는
문자열 객체가 stringname있습니다.

  1. stringnamenull이 아닌 문자열 값 (예 : "컴퓨터")이 있습니다.
    코드가 형식을 취하고
    "computer".equalsignorecase(null)
    예상 응답을 false.
  2. stringnamenull값을 :
    여기에 코드가 붙어 얻을 것이다, 같은
    null.equalsignorecase(null)
    그러나, 첫번째보기에 좋은 것하고 같은 반응을 기대 할 수있다 true,
    하지만, null실행] 할 수있는 객체가 아닌 equalsignorecase()방법.

따라서 사례 2로 인해 예외가 발생합니다.
내가 제안하는 것은 단순히 사용하는 것입니다.stringname == null


1

간단한 방법 :

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

1

경우 value반환 null의 경우, 사용하는 것입니다 :

if(value.isEmpty());

때로는 null을 확인하기 위해 if(value == null)Java에서 String이 null 인 경우에도 true를 제공하지 않을 수 있습니다.


1
Scala (Java 포함)를 if(value.isEmpty())사용하면 NullPointerException. 이 경우 더 나은 사용if(value == null)
Andrea

null이면 항상 NPE를 던지므로 이것은 확실히 잘못된 것입니다.
Roger

1

Java 7을 사용하면

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

어떤 돌아갑니다 true두 매개 변수가있는 경우 null.


0

오래 전에 답변을 받았음을 알고 있지만이 게시물을 보지 못했기 때문에 내가하는 일을 공유 할 것이라고 생각했습니다. 이것은 코드 가독성에 특히 좋지는 않지만 일련의 null 검사를 수행해야하는 경우 다음을 사용하고 싶습니다.

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

이 예에서는 문자열에서 trim이 호출되어 문자열이 null이거나 공백이면 NPE를 던지지 만 같은 줄에서 null 또는 공백을 확인할 수 있으므로 (more ) if 블록을 포맷하기가 어렵습니다.


널 또는 공백을 확인한다는 것은 무엇을 의미합니까? 여기서 null 만 확인하고 있습니다. 공백은 "COND? A : B;"의 가능한 리턴 중 하나입니다. 구성, 맞죠?
philo vivero

0

내가 올바르게 이해하면 다음과 같이해야합니다.

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

-2

마지막으로 누군가이 어리석은 질문을했을 때 대답은 다음과 같습니다.

someString.equals("null")

이 "수정"은 방법의 더 큰 문제 숨 깁니다 null하게 "null"하지만, 처음에 있습니다.


그렇지 않습니다. 따라서 이것은 해결책이 아니며 유용한 답변이 아닙니다.
Chris Stratton

내가 말할 첫번째 싶습니다 "와트"
필로하기 Vivero

이 질문에 대답하지 않습니다
제이슨 아담스

-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 ()는 잠재적으로 null 객체와 함께 사용해서는 안되므로 소개 설명이 잘못되었습니다. 이 답변의 나머지 부분은 질문과 무의미하고 무의미 해 보입니다.
Chris Stratton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.