kann String.isEmpty () in Android nicht aufrufen

80

In meiner Android-Anwendung kann ich die Funktion String.isEmpty () in JDK 1.6 nicht verwenden. Android 2.1 lib hat diese Funktion in der Klasse java.lang.String nicht

Ich habe versucht, die JRE-Systembibliothek in mein Projekt einzugeben, da es diese Funktion hat, aber es gab keine Auswirkungen.

Wie kann ich dieses Problem lösen und meiner Anwendung erlauben, diese Funktion zu verwenden?

teoREtik
quelle
11
isEmpty wird in API Level 9 hinzugefügt. Siehe hier developer.android.com/reference/java/lang/…
Mudassir
3
Seltsamerweise bin ich auf dieses Problem nicht gestoßen. Ich vermeide es jedoch, .isEmpty () zu verwenden. Ich möchte nur if (myString == null || myString.trim (). Size () == 0) verwenden
Ali
1
@Ali - ughh !! Es hört sich so an, als ob der Code, an dem Sie arbeiten, die APIs / Schnittstellenvor- und -nachbedingungen schlecht spezifiziert und überprüft.
Stephen C
Im Übrigen können Sie JavaC sogar anweisen, Code so zu kompilieren, dass er mit einer bestimmten Version von JRE kompatibel ist. Ich habe es noch nie versucht, aber ich frage mich, ob es in diesem Fall eine einfachere Lösung wäre. @Stephen: Unser Softwarearchitekt hat mir ausdrücklich gesagt, dass ich immer nach Nullen suchen soll, wenn ein Wert von einem API-Aufruf empfangen wird. Bei Benutzereingaben tritt häufig eine Inkonsistenz auf, bei der das Front-End null zurückgeben kann, wenn ein Feld leer ist, oder eine leere Zeichenfolge, wenn der Benutzer das Feld fokussiert, aber nichts eingibt. Seltsam, ich weiß.
Ali
2
@Ali - Ich bin nicht beeindruckt von Ihrem Architekten. IMO, es ist eine bessere Idee, Nullen an der Quelle zu erkennen und damit umzugehen, als an jeder API. Behandeln Sie außerdem unerwartete Nullen als Fehler und lassen Sie sie zu NPEs werden. Das Problem beim expliziten Testen auf Nullen besteht darin, dass Ihr Code mit sinnlosen Überprüfungen überfüllt ist und Sie möglicherweise in die Falle geraten, die Nullen zu "reparieren", indem Sie sie beispielsweise in leere Zeichenfolgen umwandeln.
Stephen C

Antworten:

83

Wie kann ich dieses Problem lösen und meiner Anwendung erlauben, diese Funktion zu verwenden?

Das kannst du nicht.

Verwenden Sie String.length() == 0stattdessen. Es ist abwärtskompatibel bis zurück zu JDK 1.0 ... und auch mit J2ME.

String.equals("") ist eine andere Alternative.


Sind Sie sicher, dass es keine Möglichkeit gibt, Eclipse so zu konfigurieren, dass es aus bestimmten Bibliotheken in Codeklassen eingefügt wird?

Nicht, wenn Ihre App auf einem echten Android-Gerät ausgeführt werden soll. Java / Android-Plattformen machen es Ihnen absichtlich schwer, am Verhalten der Kernklassenbibliotheken zu basteln. Zunächst können Sie dies nur tun, indem Sie das Davlik-Äquivalent des Bootklassenpfads oder der Bootclate- rt.jarDatei ändern. Beides kann nicht in einer laufenden JVM ausgeführt werden.

Diese Art des Bastelns birgt das Risiko, dass Java für andere Apps möglicherweise beschädigt wird. Selbst wenn Sie davon ausgehen, dass Sie die Trennung von Android-Apps nicht direkt gefährden können (aufgrund der unten erwähnten Trennung von Prozess und UID), können böswillige Änderungen an den (gemeinsam genutzten) Java-Kernklassen möglicherweise dazu führen, dass eine App Informationen stört oder Informationen von einer anderen App stiehlt .

Stephen C.
quelle
Das Problem ist, dass ich mit JSONRPC arbeite, Klassen aus der freien Bibliothek code.google.com/p/json-simple verwende und es eine Funktion JSONRPC2Message.parse (String arg0) gibt, die die Methode String.isEmpty () verwendet, also wann Ich starte meine App und erhalte die Ausnahme java.lang.noSuchMethodError. Sind Sie sicher, dass es keine Möglichkeit gibt, Eclipse so zu konfigurieren, dass es aus bestimmten Bibliotheken in Codeklassen eingefügt wird? Ich meine, wenn ich die String-Klasse nicht aus der Android 2.1-Bibliothek, sondern aus der JRE-Systembibliothek verwenden möchte?
TeoREtik
7
Json-simple ist Open Source; Erstellen Sie Ihre eigene Version der Bibliothek, die String.isEmpty () nicht verwendet. Das ist viel einfacher (und sicherer) als der Versuch, die Android-Laufzeitbibliothek anzupassen.
Thoredge
Wenn sie es nicht taten, wäre es für eine betrügerische App trivial, die Sicherheit zu untergraben - das bezweifle ich wirklich. Jede App wird in einem separaten Linux-Prozess unter einer eigenen UID ausgeführt, und die Android-Sicherheit basiert nicht auf dem Schutz von Java-Paketen. Wenn eine App ihre eigene Kopie ändert String, hat dies keine Auswirkungen auf andere Apps.
Poolie
@poolie - OK, aber gibt es in der "JVM", in der die App ausgeführt wird, kein Sandboxing? (Ich finde es ein bisschen schwer zu glauben, dass die Sicherheit auf Linux-Ebene der einzige Schutz ist, den Sie gegen betrügerische Apps haben, die auf Ihrem Android-Handy ausgeführt werden.)
Stephen C
120

Sie können stattdessen android.text.TextUtils.isEmpty () verwenden. Diese Methode prüft auch, ob der String null ist und seit API-Ebene 1 verfügbar ist.

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

Diese Methode wurde in API9 angezeigt, sodass Sie sie nicht vor Android2.3 verwenden können

Kzotin
quelle
5

Sie können dies verwenden TextUtils.isEmpty(str). Dies ist verfügbar seit API Level 1 oder Sie können Ihre eigene Methode wie unten erstellen

public boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}
Shan Xeeshi
quelle
2
Ich denke, das sollte die ausgewählte Antwort sein. Usint TextUtils ist die beste Option. Sie müssen keine eigene Funktion erstellen, um dasselbe zu erstellen.
Genaut
Du weißt, du hättest einfach schreiben können return (str == null || str.length() == 0);, oder?
Piovezan
@Piovezan ja, wir können das auch schreiben
Shan Xeeshi
4

Soweit ich weiß, unterstützt Android Java 5, es gibt also keine, die isEmpty();Sie length()zum Simulieren verwenden könnenisEmpty()

Jigar Joshi
quelle
1

"" .equals (yourString); gibt auch das gleiche Verhalten wie String.isEmpty ();

Muhammad Aamir Ali
quelle
Es ist eigentlich die beste Lösung, da es auch eine NullPointerException verhindert
Lukas
Dies ist nicht die beste Lösung, da Sie jedes Mal, wenn Sie vergleichen möchten, ein neues String-Objekt erstellen, während Sie mit isEmpty Null und Länge überprüfen.
Genaut
2
@ user1422434 - Nein, bist du nicht. Es gibt nur ein Objekt, das das leere Zeichenfolgenliteral für die gesamte VM darstellt.
Stephen C
Aber ich bin auch nicht mit @Lukas einverstanden. Lösungen, die "NPEs verhindern", sind im Allgemeinen eine schlechte Idee. Eine bessere Idee ist es, herauszufinden, woher das Unerwartete nullkommt, und das Problem zu beheben . Der "".equals(yourString)Ansatz ist nur dann eine gute Lösung, wenn ein nullWert für yourStringsinnvoll ist ... und erwartet wird.
Stephen C
-4

Sie müssen die Android-API auf Stufe 9 aktualisieren oder verwenden String.trim().length()==0oder String.equals("")stattdessen sollte sie für Ihre Android-API-Stufe und Ihre JDK-Version funktionieren.

Motor Bai
quelle
Was? String " "ist nicht leer! Warum schlagen Sie vor, die Saite zu kürzen?
RuX
1
@ruX " ".trim()wird leer sein !!! Weißt du das überhaupt? Bewerten Sie nicht, wenn Sie meine Beschreibung NICHT verstehen !!!
Motor Bai
@Eugenie Bai String.trim().length()==0und String.equals("")geben unterschiedliche Ergebnisse zurück, wenn String = " ". Das zweite Snippet ist korrekt
ruX