nie można wywołać metody String.isEmpty () w systemie Android

80

W mojej aplikacji na Androida nie mogę używać funkcji String.isEmpty (), która znajduje się w JDK 1.6. Android 2.1 lib nie ma tej funkcji w klasie java.lang.String

Próbowałem wprowadzić bibliotekę JRE System do mojego projektu, ponieważ ma taką funkcję, ale nie było efektów.

Jak mogę rozwiązać ten problem i pozwolić mojej aplikacji na korzystanie z tej funkcji?

teoREtik
źródło
11
isEmpty zostało dodane na poziomie API 9. Zobacz tutaj developer.android.com/reference/java/lang/…
Mudassir
3
Dziwne, nie napotkałem tego problemu. Unikam jednak używania .isEmpty (). Po prostu wolę użyć if (myString == null || myString.trim (). Size () == 0)
Ali
1
@Ali - ughh !! Wygląda na to, że kod, nad którym pracujesz, źle radzi sobie z określaniem i sprawdzaniem warunków wstępnych i końcowych interfejsu API / interfejsu.
Stephen C
Przy okazji możesz nawet powiedzieć JavaC, aby kompilował kod, aby był kompatybilny z wersją JRE stawową. Nigdy tego nie próbowałem, ale zastanawiam się, czy w tym przypadku byłoby to łatwiejsze rozwiązanie. @Stephen: Nasz architekt oprogramowania powiedział mi, żebym zawsze sprawdzał wartości null, gdy wartość jest odbierana z wywołania interfejsu API. Ponadto przy wprowadzaniu danych przez użytkownika często występuje niespójność, w której front-end może zwrócić wartość null, jeśli pole jest puste, lub pusty ciąg, jeśli użytkownik skupia się na polu, ale niczego nie wpisuje. Wiem, dziwne.
Ali
2
@Ali - Nie jestem pod wrażeniem twojego architekta. IMO, lepiej jest wykrywać wartości null i radzić sobie z nimi u źródła, a nie w każdym interfejsie API. Poza tym traktuj nieoczekiwane wartości zerowe jako błędy i pozwól im zamienić się w NPE. Problem z jawnym testowaniem wartości null polega na tym, że twój kod jest zaśmiecony bezcelowymi kontrolami i możesz wpaść w pułapkę „naprawiania” wartości null, zamieniając je na puste ciągi (na przykład).
Stephen C

Odpowiedzi:

83

Jak mogę rozwiązać ten problem i pozwolić mojej aplikacji na korzystanie z tej funkcji?

Nie możesz.

Użyj String.length() == 0zamiast tego. Jest kompatybilny wstecz aż do JDK 1.0 ... a także z J2ME.

String.equals("") to kolejna alternatywa.


Czy na pewno nie ma możliwości skonfigurowania Eclipse do umieszczania w kodzie klas z określonych bibliotek?

Nie, jeśli chcesz, aby Twoja aplikacja działała na prawdziwym urządzeniu z Androidem. Platformy Java / Android celowo utrudniają majstrowanie przy zachowaniu podstawowych bibliotek klas. Na początek można to zrobić tylko przez zmodyfikowanie odpowiednika ścieżki bootclasspath lub rt.jarpliku Davlika , a żadnego z nich nie można zrobić w działającej JVM.

Tego rodzaju majsterkowania ma ryzyka potencjalnie zerwania Java dla innych aplikacji. Nawet zakładając, że nie można bezpośrednio naruszyć separacji aplikacji na Androida (ze względu na separację proces / uid wspomnianą poniżej), złośliwe poprawki do (współdzielonych) podstawowych klas Java mogą nadal potencjalnie pozwolić jednej aplikacji na zakłócanie lub kradzież informacji z innej aplikacji .

Stephen C.
źródło
Problem w tym, że pracuję z JSONRPC, korzystając z klas z darmowej biblioteki code.google.com/p/json-simple i jest funkcja JSONRPC2Message.parse (String arg0), która używa metody String.isEmpty (), więc kiedy Po uruchomieniu aplikacji pojawia się wyjątek java.lang.noSuchMethodError. Czy na pewno nie ma możliwości skonfigurowania Eclipse do umieszczania w kodzie klas z określonych bibliotek? Chodzi mi o to, czy chcę użyć klasy String nie z biblioteki systemu Android 2.1, ale z biblioteki systemu JRE?
teoREtik
7
Json-simple jest open source; stwórz własną wersję biblioteki, która nie używa String.isEmpty (). Jest to znacznie prostsze (i bezpieczniejsze) niż próba dostosowania biblioteki wykonawczej systemu Android.
thoredge
Gdyby tego nie robili, to byłoby trywialne, gdyby nieuczciwa aplikacja naruszyła bezpieczeństwo - naprawdę w to wątpię. Każda aplikacja działa w oddzielnym procesie Linuksa pod własnym identyfikatorem użytkownika, a zabezpieczenia systemu Android nie polegają na zabezpieczeniach pakietów Java. Jeśli aplikacja modyfikuje swoją własną kopię String, nie ma to wpływu na inne aplikacje.
poolie,
@poolie - OK, ale czy nie ma piaskownicy w „JVM”, która uruchamia aplikację? (Trudno mi uwierzyć, że zabezpieczenia na poziomie Linuksa to jedyna ochrona przed nieuczciwymi aplikacjami działającymi na telefonie z Androidem).
Stephen C
120

Zamiast tego możesz użyć android.text.TextUtils.isEmpty () . Ta metoda sprawdza również, czy String ma wartość null i jest dostępny od poziomu interfejsu API 1.

if (TextUtils.isEmpty(str)) {
    Log.d(TAG, "String is empty or null!");
}
twaddington
źródło
6

ta metoda pojawiła się w API9, więc nie możesz jej używać przed Android2.3

kzotin
źródło
5

Możesz tego użyć TextUtils.isEmpty(str). Jest to dostępne od poziomu API 1 lub możesz utworzyć własną metodę, jak poniżej

public boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}
Shan Xeeshi
źródło
2
Myślę, że to powinna być wybrana odpowiedź. Najlepszą opcją jest Usint TextUtils. Nie musisz tworzyć własnej funkcji, aby zrobić to samo.
Genaut
Wiesz, że mogłeś po prostu napisać return (str == null || str.length() == 0);, prawda?
Piovezan
@Piovezan tak, możemy to również napisać
Shan Xeeshi
4

o ile wiem, Android obsługuje java 5, więc nie ma isEmpty();możliwości użycia length()do symulacjiisEmpty()

jmj
źródło
1

„” .equals (yourString); również daje takie samo zachowanie jak String.isEmpty ();

Muhammad Aamir Ali
źródło
Właściwie to najlepsze rozwiązanie, ponieważ zapobiega również wyjątkowi NullPointerException
Lukas
To nie jest najlepsze rozwiązanie, ponieważ za każdym razem, gdy chcesz porównać, tworzysz nowy obiekt String, podczas gdy za pomocą isEmpty sprawdzasz wartości null i length.
Genaut
2
@ user1422434 - Nie, nie jesteś. Istnieje jeden i tylko jeden obiekt reprezentujący pusty literał ciągu dla całej maszyny wirtualnej.
Stephen C
Ale ja też nie zgadzam się z @Lukasem. Rozwiązania, które „zapobiegają NPE” są ogólnie złym pomysłem. Lepszym pomysłem jest nullustalenie , skąd pochodzi nieoczekiwane, i naprawienie tego problemu . "".equals(yourString)Podejście jest jedynym dobrym rozwiązaniem, jeśli nullwartość yourStringma sens ... a oczekiwano.
Stephen C
-4

Musisz zaktualizować Android API do poziomu 9 lub użyć String.trim().length()==0lub String.equals("")zamiast tego, powinno działać na poziomie Android API i wersji JDK.

Silnik Bai
źródło
Co? Ciąg " "nie jest pusty! Dlaczego sugerujesz przycinanie sznurka?
ruX
1
@ruX " ".trim()będzie pusty !!! Czy w ogóle o tym wiesz? Nie oceniaj w dół, jeśli NIE rozumiesz mojego opisu !!!
Engine Bai
@Eugenie Bai String.trim().length()==0i String.equals("")zwróć inne wyniki, gdy String = " ". Drugi fragment jest poprawny
ruX