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?


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 .


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



6

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


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;
}

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()


1

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.