Android에서 String.isEmpty ()를 호출 할 수 없습니다.


80

내 안드로이드 응용 프로그램 에서 JDK 1.6에 위치한 String.isEmpty () 함수를 사용할 수 없습니다 . Android 2.1 lib에는 java.lang.String 클래스에이 기능이 없습니다.

이 기능이 있기 때문에 JRE System 라이브러리를 프로젝트에 입력하려고했지만 효과가 없었습니다.

이 문제를 해결하고 내 응용 프로그램에서이 기능을 사용하도록 허용하려면 어떻게해야합니까?


11
isEmpty는 API 레벨 9에 추가되었습니다. 여기를 참조하십시오. developer.android.com/reference/java/lang/…
Mudassir 2011 년

3
이상하게도 나는이 문제를 보지 못했습니다. 그래도 .isEmpty () 사용하지 않습니다. 나는 단지 if (myString == null || myString.trim (). size () == 0)
Ali

1
@Ali-으악 !! 작업하는 코드가 API / 인터페이스 사전 조건 및 사후 조건을 지정하고 확인하는 잘못된 작업을 수행하는 것 같습니다.
Stephen C

쯤이면 JRE의 관절 버전과 호환되도록 코드를 컴파일하도록 JavaC에 지시 할 수도 있습니다. 나는 그것을 시도한 적이 없지만이 경우 더 쉬운 해결책이 될지 궁금합니다. @Stephen : 저는 소프트웨어 아키텍트로부터 API 호출에서 값이 수신 될 때 항상 null을 확인하라는 지시를 받았습니다. 또한 사용자 입력으로 인해 프런트 엔드가 필드가 비어 있으면 null을 반환하고 사용자가 필드에 초점을 맞추지 만 아무것도 입력하지 않으면 빈 문자열을 반환 할 수있는 불일치가 종종 있습니다. 내가 아는 이상.
Ali

2
@Ali-나는 당신의 건축가에게 깊은 인상을받지 못했습니다. IMO, 모든 API가 아닌 소스에서 null을 감지하고 처리하는 것이 더 좋습니다. 그 외에도 예기치 않은 null을 버그로 처리하고 NPE로 전환하십시오. null을 명시 적으로 테스트 할 때의 문제는 코드가 무의미한 검사로 어수선 해져서 ​​null을 빈 문자열로 바꿔서 (예를 들어) "고정"하는 함정에 빠질 수 있다는 것입니다.
Stephen C

답변:


83

이 문제를 해결하고 내 응용 프로그램에서이 기능을 사용하도록 허용하려면 어떻게해야합니까?

당신은 할 수 없습니다.

String.length() == 0대신 사용하십시오 . JDK 1.0까지 역 호환되며 J2ME 와도 호환됩니다.

String.equals("") 또 다른 대안입니다.


명확한 라이브러리의 코드 클래스에 넣도록 Eclipse를 구성하는 방법이 없다고 확신합니까?

앱이 실제 Android 기기 에서 실행되기를 원하는 경우는 아닙니다 . Java / Android 플랫폼은 의도적으로 코어 클래스 라이브러리의 동작을 다루기 어렵게 만듭니다. 우선, 부팅 클래스 경로 또는 rt.jar파일에 해당하는 Davlik을 수정해야만 이를 수행 할 수 있으며 실행중인 JVM 내에서는 둘 다 수행 할 수 없습니다.

이러한 종류의 땜질은 잠재적으로 다른 앱의 Java를 손상시킬 위험 이 있습니다. Android 앱 분리를 직접 손상시킬 수 없다고 가정하더라도 (아래에 언급 된 프로세스 / UI 분리로 인해), (공유) Java 코어 클래스에 대한 악의적 인 조정으로 인해 잠재적으로 한 앱이 다른 앱을 방해하거나 정보를 훔칠 수 있습니다. .


문제는 무료 라이브러리 code.google.com/p/json-simple의 클래스를 사용하여 JSONRPC로 작업하고 String.isEmpty () 메서드를 사용하는 JSONRPC2Message.parse (String arg0) 함수가 있다는 것입니다. 내 앱을 실행하면 java.lang.noSuchMethodError 예외가 발생합니다. 명확한 라이브러리의 코드 클래스에 넣도록 Eclipse를 구성하는 방법이 없다고 확신합니까? Android 2.1 라이브러리가 아닌 JRE System 라이브러리에서 String 클래스를 사용하려면 어떻게해야합니까?
teoREtik 2011 년

7
Json-simple은 오픈 소스입니다. String.isEmpty ()를 사용하지 않는 자체 버전의 라이브러리를 만듭니다. Android 런타임 라이브러리를 조정하는 것보다 훨씬 간단하고 안전합니다.
thoredge 2011 년

그렇지 않다면 악성 앱이 보안을 무너 뜨리는 것은 사소한 일이 될 것입니다 . 각 앱은 고유 한 uid로 별도의 Linux 프로세스에서 실행되며 Android 보안은 Java 패키지 보호에 의존하지 않습니다. 앱이 자체 사본을 수정하는 경우 String다른 앱에는 영향을 미치지 않습니다.
poolie 2012

@poolie-좋습니다.하지만 앱을 실행하는 "JVM"내에 일부 샌드 박싱이 없습니까? (Linux 수준 보안이 Android 휴대 전화에서 실행되는 악성 앱에 대한 유일한 보호 수단 이라고 믿기 어렵습니다 .)
Stephen C


120

대신 android.text.TextUtils.isEmpty () 를 사용할 수 있습니다 . 이 메서드는 또한 문자열이 null이고 API 레벨 1부터 사용 가능한지 확인합니다.

if (TextUtils.isEmpty(str)) {
    Log.d(TAG, "String is empty or null!");
}

6

이 메서드는 API9에 나타 났으므로 Android2.3 이전에는 사용할 수 없습니다.


5

이것을 사용할 수 있습니다 TextUtils.isEmpty(str). API 레벨 1부터 가능하거나 아래와 같은 방법으로 직접 생성 할 수 있습니다.

public boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}

2
나는 이것이 선택된 대답이어야한다고 생각한다. Usint TextUtils가 최상의 옵션입니다. 똑같이 만들기 위해 자신의 함수를 만들 필요가 없습니다.
Genaut

방금 썼을 수도 있다는 거 알아요 return (str == null || str.length() == 0);?
Piovezan

@Piovezan 그래 우리는 잘 쓸 수
산 Xeeshi

4

내가 아는 한 안드로이드는 자바 5를 지원하므로 시뮬레이션에 isEmpty();사용할 수 없습니다.length()isEmpty()


1

"".equals (yourString); 또한 String.isEmpty (); 같은 동작을 제공합니다.


그것은 또한는 NullPointerException을 방지하기 때문에 실제로 최적의 솔루션입니다
루카스

isEmpty로 널과 길이를 확인하는 동안 비교할 때마다 새 String 객체를 생성하기 때문에 이것은 최상의 솔루션이 아닙니다.
Genaut

2
@ user1422434-아니야. 전체 VM에 대한 빈 문자열 리터럴을 나타내는 단 하나의 개체가 있습니다.
Stephen C

그러나 나는 @Lukas에도 동의하지 않습니다. "NPE를 방지"하는 솔루션은 일반적으로 잘못된 생각입니다. 더 나은 아이디어는 예상치 못한 원인 null이 어디에서 오는지 파악하고 문제를 해결 하는 것입니다 . 이 "".equals(yourString)접근 방식은 nullyourString이 의미 있고 예상되는 경우에만 좋은 솔루션 입니다.
Stephen C

-4

Android API를 레벨 9로 업그레이드하거나 사용 String.trim().length()==0하거나 String.equals("")대신 Android API 레벨 및 JDK 버전에서 작동해야합니다.


뭐? 문자열 " "이 비어 있지 않습니다! 왜 끈을 다듬을 것을 제안합니까?
ruX 2014

1
@ruX " ".trim()가 비어 있습니다 !!! 당신도 알고 있습니까 ?? 당신이 경우 다운 속도하지 마십시오 하지 마십시오 내 설명을 이해!
Engine Bai

@Eugenie 바이 String.trim().length()==0와는 String.equals("")다른 결과 때를 반환 String = " ". 두 번째 스 니펫이 정확함
ruX 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.