내 문자열이 null인지 확인하는 방법?


172

문자열에 의미있는 값이있는 경우에만 일부 작업을 수행하려고합니다. 그래서 나는 이것을 시도했다.

if (!myString.equals("")) {
doSomething
}

if (!myString.equals(null)) {
doSomething
}

if ( (!myString.equals("")) && (!myString.equals(null))) {
doSomething
}

if ( (!myString.equals("")) && (myString!=null)) {
doSomething
}

if ( myString.length()>0) {
doSomething
}

그리고 모든 경우에 내 프로그램 doSomething은 내 문자열이 비어 있다는 사실에도 불구하고. 와 같습니다 null. 그래서 무엇이 잘못 되었나요?

추가 :

문제의 원인을 찾았습니다. 변수는 문자열로 선언되었으며 결과적 null으로이 변수에 지정된 변수는 "null"! 그래서 if (!myString.equals("null"))작동합니다.


2
null메소드가 없으므로도 없습니다 equals(). 경우 myString했다 null, 당신은 어떻게 이제까지의 메소드를 호출 할 것인가? :)
BalusC

1
System.out.println(myString)if-block 직전 에 당신 에게 무엇이 있는지 볼 수 있도록 제안 하시겠습니까?
Michael Myers

1
"와 같다"는 것을 어떻게 알 수 null있습니까?
Richard JP Le Guen

6
null이 변수에 할당 된 것은 다음과 같이 바뀌 었습니다 "null". 이것은 끔찍한 생각입니다. 가능하면이 디자인을 변경하십시오.
polygenelubricants 17

8
Yuck-(! myString.equals ( "null"))이 최상의 솔루션인지 여부는 확인하지 않습니다. 나는 문자열 "null"이 myString에 할당 된 지점을 버그로 생각할 것이다.
Bert F

답변:


231
if (myString != null && !myString.isEmpty()) {
  // doSomething
}

추가 의견으로, equals계약 에서이 용어를 알고 있어야합니다 .

보낸 사람 Object.equals(Object):

비 - 널 레퍼런스 값 x, x.equals(null)해야한다 return false.

비교하는 방법 nullx == null및 을 사용하는 것 x != null입니다.

또한, x.fieldx.method()발생 NullPointerException하는 경우 x == null.


2
효율성을 위해 등호가 아닌 길이 검사를 수행해야합니다. 이 링크를 확인하십시오 hanuska.blogspot.com/2006/08/empty-string.html
CoolBeans

7
가독성 s.isEmpty()대신 대신 해야한다고 말하고 싶습니다 s.length() == 0. 성능의 차이는 무시할 수 있습니다. 나는 그것이 s.equals("")끔찍한 것에 동의합니다 .
polygenelubricants

6
가독성에 동의합니다. isEmpty ()가 Java 6에만 있기 때문에 Java 5 대 Java 6을 사용하는지 여부에 따라 다릅니다.
CoolBeans

@ CoolBeans : 좋은 의견! 나는 그것을 몰랐다! 나는 자바 파티에 조금 늦었다 =)
polygenelubricants

26

경우 myString이며 null, 다음 호출 myString.equals(null)또는 myString.equals("")실패합니다 NullPointerException. 널 변수에서 인스턴스 메소드를 호출 할 수 없습니다.

다음과 같이 null을 먼저 확인하십시오.

if (myString != null && !myString.equals("")) {
    //do something
}

이 경우 단락 평가 를 사용 하여 .equalsif myString가 널 검사에 실패 하지 않습니다 .


단락시 +1; 표현이 작동하는 것이 필수적입니다. 그러나 .isEmpty()대신 실제로 사용해야합니다 .equals("").
polygenelubricants

1
좋아, 나는이 포스트에 나의 의견을 남기려고했다. lol. -> "효율성을 위해 동등한 반대로 당신은 길이 체크를해야이 링크 hanuska.blogspot.com/2006/08/empty-string.html을 확인하십시오."
CoolBeans

@CoolBeans : 물론 Java 6에서는 할 수 myString.isEmpty()있습니다. 그러나이 수준에서 가독성은 최적화보다 우선하며 사람들은 독서에 더 익숙 할 것 myString.equals("")입니다. – 또는 가능하지 않을 수도 있습니다.
Michael Myers

20

아파치 커먼즈 StringUtils.isNotEmpty가 가장 좋은 방법입니다.


13

myString이 실제로 널인 경우 NPE (Null Pointer Exception)로 참조에 대한 호출이 실패합니다. Java 6부터는 길이 검사 대신 #isEmpty 를 사용 하십시오 (어쨌든 검사와 함께 빈 문자열을 새로 작성하지 마십시오).

if (myString != null &&  !myString.isEmpty()){
    doSomething();
}

또한 String 리터럴과 비교할 때 null 검사가 필요하지 않도록 명령문을 되돌릴 수 있습니다.

if ("some string to check".equals(myString)){
  doSomething();
} 

대신에 :

if (myString != null &&  myString.equals("some string to check")){
    doSomething();
}

1
좋은 지적이지만 마지막 두 경우는 동일하지 않습니다. myString = "abc"를 사용하면 가운데가 doSomething을 호출하지 않지만 세 번째는 doSomething을 호출합니다.
rimsky

고정 된 것 @rimsky
pavi2410

7

작동 !!!!

if (myString != null && !myString.isEmpty()) {
    return true;
}
else {
    return false;
}

6

myString객체가 null다음 인지 확인해야합니다 .

if (myString != null) {
    doSomething
}

5

문자열이 null이면 다음과 같은 호출에서 NullReferenceException이 발생합니다.

myString.equals (null)

그러나 어쨌든, 나는 이와 같은 방법이 당신이 원하는 것이라고 생각합니다.

public static class StringUtils
{
    public static bool isNullOrEmpty(String myString)
    {
         return myString == null || "".equals(myString);
    }
}

그런 다음 코드에서 다음과 같이 할 수 있습니다.

if (!StringUtils.isNullOrEmpty(myString))
{
    doSomething();
}

5

기존 유틸리티를 사용하거나 고유 한 방법을 만드는 것이 좋습니다.

public static boolean isEmpty(String string) {
    return string == null || string.length() == 0;
}

그런 다음 필요할 때 사용하십시오.

if (! StringUtils.isEmpty(string)) {
  // do something
}

위에서 언급했듯이 || && 연산자 단락. 그것은 그들이 그들의 가치를 결정할 수있는 즉시 멈추는 것을 의미합니다. 따라서 (string == null)이 true이면 표현식이 항상 true이므로 길이 부분을 평가할 필요가 없습니다. 왼쪽이 거짓이면 &&와 마찬가지로 표현식은 항상 거짓이므로 더 이상 평가할 필요가 없습니다.

참고로 길이를 사용하는 것이 일반적으로 .equals를 사용하는 것보다 좋습니다. 성능은 약간 나아지고 (많지 않음) 객체 생성이 필요하지 않습니다 (대부분의 컴파일러가이를 최적화 할 수 있음)


4

시험,

myString!=null && myString.length()>0

myString이 null 인 경우 불가능합니다
hsmit

4
이것은 myString이 null 일 때 가능합니다. &&의 왼쪽 부분이 실패하면 올바른 표현이 전혀 평가되지 않습니다.
bragboy


4

문자열을 처리해야 할 때마다 (거의 모든 시간) 나는 멈추고 어떤 방법이 실제로 빈 문자열을 확인하는 가장 빠른 방법인지 궁금합니다. 물론 string.Length == 0 검사는 Length가 속성이므로 속성 값을 검색하는 것 이외의 처리가 없어야합니다. 그러나 나는 왜 나 자신에게 묻습니다. 왜 String.Empty가 있습니까? 길이보다 String.Empty를 확인하는 것이 더 빠릅니다. 글쎄, 나는 그것을 테스트하기로 결심했습니다. 나는 작은 Windows Console 앱을 코딩하여 천만 회귀에 대한 특정 점검을 수행하는 데 얼마나 걸 렸는지 알려줍니다. NULL 문자열, 빈 문자열 및 ""문자열의 세 가지 다른 문자열을 확인했습니다. 나는 5 가지 방법을 사용했습니다 : String.IsNullOrEmpty (), str == null, str == null || str == String.Empty, str == null || str == "", str == null || str.

String.IsNullOrEmpty()
NULL = 62 milliseconds
Empty = 46 milliseconds
"" = 46 milliseconds

str == null
NULL = 31 milliseconds
Empty = 46 milliseconds
"" = 31 milliseconds

str == null || str == String.Empty
NULL = 46 milliseconds
Empty = 62 milliseconds
"" = 359 milliseconds

str == null || str == ""
NULL = 46 milliseconds
Empty = 343 milliseconds
"" = 78 milliseconds

str == null || str.length == 0
NULL = 31 milliseconds
Empty = 63 milliseconds
"" = 62 milliseconds

이 결과에 따르면, 평균 검사 str == null는 가장 빠르지 만 항상 원하는 결과를 얻지는 못할 수 있습니다. if str = String.Empty또는 str = ""결과는 false입니다. 그런 다음 두 번째 장소에 묶여 2를 가지고 String.IsNullOrEmpty()str == null || str.length == 0. String.IsNullOrEmpty()더보기 좋고 작성 하기 가 더 쉽고 빠르기 때문에 다른 솔루션보다 사용하는 것이 좋습니다.


3

나는 이런 식으로 할 것입니다 :

( myString != null && myString.length() > 0 )
    ? doSomething() : System.out.println("Non valid String");
  • null 테스트는 myString에 String 인스턴스가 포함되어 있는지 확인합니다.
  • length ()는 길이를 반환하며 equals ( "")와 같습니다.
  • myString이 먼저 null인지 확인하면 NullPointerException이 발생하지 않습니다.

3

나는 사용하고 있었다 StringUtil.isBlank(string)

문자열이 비어 있는지 테스트합니다 (null, emtpy 또는 공백 만).

이건 지금까지 최고입니다

다음은 문서의 orignal 방법입니다

/**
    * Tests if a string is blank: null, emtpy, or only whitespace (" ", \r\n, \t, etc)
    * @param string string to test
    * @return if string is blank
    */
    public static boolean isBlank(String string) {
        if (string == null || string.length() == 0)
            return true;

        int l = string.length();
        for (int i = 0; i < l; i++) {
            if (!StringUtil.isWhitespace(string.codePointAt(i)))
                return false;
        }
        return true;
    } 

2

이것은 작동해야합니다 :

if (myString != null && !myString.equals(""))
    doSomething
}

그렇지 않으면 myString에 예상하지 못한 값이있을 수 있습니다. 다음과 같이 인쇄 해보십시오.

System.out.println("+" + myString + "+");

문자열을 둘러싸 기 위해 '+'기호를 사용하면 고려하지 않은 여분의 공백이 있는지 표시됩니다.


2

if(str.isEmpty() || str==null){ do whatever you want }


3
isEmpty가 반대로됩니다. null 객체에서 메소드를 호출하면 NPE를 얻습니다
Brian

문자열이 null이면 null을 확인하기 전에도 null 포인터 예외가 발생합니다. 이 코드는 절대 사용해서는 안됩니다!
gil.fernandes

2

자, 이것이 Java에서 데이터 유형이 작동하는 방식입니다. (내가 영어를 변명해야 할 것입니다, 아마도 올바른 어휘를 사용하지 않을 것입니다. 두 단어를 구별해야합니다. 기본 데이터 유형과 일반 데이터 유형. 기본 데이터 유형은 존재하는 모든 것을 거의 구성합니다. 예를 들어, 일반 데이터 유형 또는 복합 데이터 유형은 다른 모든 것입니다 문자열은 문자 배열이므로 복잡한 데이터 유형입니다.

생성하는 모든 변수는 실제로 메모리의 값에 대한 포인터입니다. 예를 들면 다음과 같습니다.

String s = new String("This is just a test");

변수 "s"는 문자열을 포함하지 않습니다. 포인터입니다. 이 포인터는 메모리의 변수를 가리 킵니다. 를 호출하면 해당 객체 System.out.println(anyObject)toString()메소드가 호출됩니다. toStringObject에서 재정의하지 않으면 포인터가 인쇄됩니다. 예를 들면 다음과 같습니다.

public class Foo{
    public static void main(String[] args) {
        Foo f = new Foo();
        System.out.println(f);
    }
}

>>>>
>>>>
>>>>Foo@330bedb4

"@"뒤에있는 모든 것이 포인터입니다. 복잡한 데이터 형식에서만 작동합니다. 기본 데이터 유형은 포인터에 직접 저장됩니다. 따라서 실제로 포인터가 없으며 값이 직접 저장됩니다.

예를 들면 다음과 같습니다.

int i = 123;

이 경우 포인터를 저장하지 않습니다. 정수 값 123 (바이트 ofc)을 저장합니다.

좋아, 그래서 ==운영자 에게 돌아와 보자. 메모리에서 포인터 위치에 저장된 내용이 아니라 포인터를 항상 비교합니다.

예:

String s1 = new String("Hallo");
String s2 = new String("Hallo");

System.out.println(s1 == s2);

>>>>> false

이 두 문자열에는 다른 포인터가 있습니다. 그러나 String.equals (String other)는 내용을 비교합니다. 동일한 내용을 가진 서로 다른 두 객체의 포인터가 동일하므로 기본 데이터 유형을 '=='연산자와 비교할 수 있습니다.

Null은 포인터가 비어 있음을 의미합니다. 빈 기본 데이터 형식은 기본적으로 0 (숫자)입니다. 그러나 복잡한 객체의 경우 Null은 해당 객체가 존재하지 않음을 의미합니다.

인사말


2

나를 위해 문자열에 Java에서 의미있는 내용이 있는지 확인하는 것이 가장 좋습니다.

string != null && !string.trim().isEmpty()

먼저 문자열 null을 피해야 하는지 확인한 NullPointerException다음 공백 만있는 문자열 확인을 피하기 위해 모든 공백 문자를 자르고 마지막으로 잘린 문자열이 비어 있지 않은지 확인합니다 (예 : 길이 0).


1

나는 안드로이드 에서이 문제가 있었고이 방법을 사용한다 (나를 위해 일하십시오) :

String test = null;
if(test == "null"){
// Do work
}

그러나 Java 코드에서는 다음을 사용합니다.

String test = null;
if(test == null){
// Do work
}

그리고 :

private Integer compareDateStrings(BeanToDoTask arg0, BeanToDoTask arg1, String strProperty) {
    String strDate0 = BeanUtils.getProperty(arg0, strProperty);_logger.debug("strDate0 = " + strDate0);
    String strDate1 = BeanUtils.getProperty(arg1, strProperty);_logger.debug("strDate1 = " + strDate1);
    return compareDateStrings(strDate0, strDate1);
}

private Integer compareDateStrings(String strDate0, String strDate1) {
    int cmp = 0;
    if (isEmpty(strDate0)) {
        if (isNotEmpty(strDate1)) {
            cmp = -1;
        } else {
            cmp = 0;
        }
    } else if (isEmpty(strDate1)) {
        cmp = 1;
    } else {
        cmp = strDate0.compareTo(strDate1);
    }
    return cmp;
}

private boolean isEmpty(String str) {
    return str == null || str.isEmpty();
}
private boolean isNotEmpty(String str) {
    return !isEmpty(str);
}


1

Android에서는 isEmpty에서 유틸리티 메소드 를 사용하여이를 확인할 수 있습니다 TextUtils.

public static boolean isEmpty(CharSequence str) {
    return str == null || str.length() == 0;
}

isEmpty(CharSequence str)방법은 조건, null길이 및 길이 를 모두 확인합니다 .


1

나는 항상 다음과 같이 사용합니다 :

if (mystr != null && !mystr.isEmpty()){
  //DO WHATEVER YOU WANT OR LEAVE IT EMPTY
}else {
  //DO WHATEVER YOU WANT OR LEAVE IT EMPTY
}

또는 이것을 프로젝트에 복사 할 수 있습니다 :

private boolean isEmptyOrNull(String mystr){
    if (mystr != null && !mystr.isEmpty()){ return true; }
    else { return false; }
}

그냥 다음과 같이 호출하십시오.

boolean b = isEmptyOrNull(yourString);

비어 있거나 null 인 경우 true를 반환합니다.
b=true비어 있거나 null 인 경우

또는 null 일 때 try catch 및 catch를 사용할 수 있습니다.


0

myString은 문자열이 아니라 문자열 배열이라고 생각합니다. 해야 할 일은 다음과 같습니다.

String myNewString = join(myString, "")
if (!myNewString.equals(""))
{
    //Do something
}

내 코드는 처리 용입니다. 처리는 Java 기반 프로그래밍 언어입니다. 자세한 내용은 대한 가입 : processing.org/reference/join_.html를 .
17:52에

0

다음을 사용하여 문자열이 null인지 확인할 수 있습니다.

String Test = null;
(Test+"").compareTo("null")

결과가 0이면 (Test + "") = "null"입니다.


이것은 단지 불필요한 캐릭터 생성
svarog

0

나는 안드로이드 응용 프로그램 l에서 null에 대해 위에서 주어진 대부분의 예제를 시도했지만 IT는 실패했습니다. 그래서 나는 언제든지 나를 위해 일한 해결책을 생각해 냈습니다.

String test = null+"";
If(!test.equals("null"){
       //go ahead string is not null

}

따라서 단순히 위에서와 같이 빈 문자열을 연결하고 "null"에 대해 테스트하면 정상적으로 작동합니다. 실제로 예외는 발생하지 않습니다


1
아니요, 그것은 절대적으로 끔찍한 해결책입니다. 위의 답변이 효과가 있습니다.
Konrad Rudolph

@KonradRudolph 실제로 결론에 도달하기 전에 위의 솔루션 중 일부를 시도했습니다. 나는 recyclerview 어댑터에서 이러한 솔루션을 사용하려고 시도했지만 l이 대답을 얻을 때까지 올바른 결과를 얻지 못했습니다.
leeCoder

나는 이것이 코드에 다른 문제가 있음을 의미한다고 확신 할 수 있으며 오류의 원인이 아니라 증상을 수정하는 것입니다. 이것을 잘못된 방법으로 사용하지 마십시오. 그러나 이것은 화물 컬트 프로그래밍 의 전형적인 경우입니다 .
Konrad Rudolph


0

Android에서 작업하는 경우 간단한 TextUtils 클래스를 사용할 수 있습니다. 다음 코드를 확인하십시오.

if(!TextUtils.isEmpty(myString)){
 //do something
}

이것은 간단한 코드 사용법입니다. 답변이 반복 될 수 있습니다. 그러나 당신을 위해 단일하고 간단한 점검을하는 것은 간단합니다.


-5

null로 확인해야합니다 if(str != null).


5
귀하의 솔루션은 몇 년 전에 다른 사용자에 의해 게시되었습니다 ... 그것을 반복하는 요점은 무엇입니까?
TDG

1
나는 대답이 아닌 내가 그에게 대답하는 이유를 확인 참조
rawa rawandze

6
그는 2010 년 이후로 답변을 확인하지 않았으므로 이전 답변을 반복하면 답변을 확인할 것입니다.
TDG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.