AndroidでString.isEmpty()を呼び出すことはできません


80

私のAndroidアプリケーションでは、JDK 1.6にあるString.isEmpty()関数を使用できません。Android 2.1 libには、java.lang.Stringクラスにこの関数がありません

この機能があるので、JREシステムライブラリをプロジェクトに入力しようとしましたが、効果はありませんでした。

この問題を解決し、アプリケーションでこの機能を使用できるようにするにはどうすればよいですか?


11
isEmptyはここAPIレベル9を参照してくださいに追加されdeveloper.android.com/reference/java/lang/...
Mudassir

3
奇妙なことに、私はこの問題に遭遇していません。ただし、.isEmpty()の使用は避けています。if(myString == null || myString.trim()。size()== 0)
Ali

1
@アリ-うーん!! あなたが取り組んでいるコードは、API /インターフェースの前提条件と事後条件を指定してチェックするという悪い仕事をしているようです。
スティーブンC

によって、JREの関節バージョンと互換性があるようにコードをコンパイルするようにJavaCに指示することもできます。私はそれを試したことがありませんが、この場合はもっと簡単な解決策になるのではないかと思います。@Stephen:API呼び出しから値を受け取ったときに、常にnullをチェックするようにソフトウェアアーキテクトから特に言われました。また、ユーザー入力では、フィールドが空の場合はフロントエンドがnullを返し、ユーザーがフィールドにフォーカスして何も入力しない場合は空の文字列を返す可能性があるという矛盾がよくあります。奇妙なことです。
アリ

2
@ Ali-私はあなたの建築家に感銘を受けていません。IMO、すべてのAPIではなく、ソースでnullを検出して処理することをお勧めします。それとは別に、予期しないnullをバグとして扱い、NPEに変えてください。nullを明示的にテストする際の問題は、コードが無意味なチェックで雑然としていることです。たとえば、nullを空の文字列に変換することで、nullを「修正」するという罠に陥る可能性があります。
スティーブンC

回答:


83

この問題を解決し、アプリケーションでこの機能を使用できるようにするにはどうすればよいですか?

できません。

String.length() == 0代わりに使用してください。JDK1.0までの下位互換性があります...そしてJ2MEとも互換性があります。

String.equals("") 別の選択肢です。


明確なライブラリからコードクラスに入れるようにEclipseを構成する方法がないと確信していますか?

アプリを実際のAndroidデバイスで実行したい場合は違います。Java / Androidプラットフォームは、コアクラスライブラリの動作を意図的にいじくり回すことを困難にします。まず、bootclasspathまたはrt.jarファイルに相当するDavlikを変更することによってのみそれを行うことができ、実行中のJVM内ではこれらのいずれも行うことができません。

この種のいじくり回しは、他のアプリのJavaを壊す可能性があるリスクがあります。Androidアプリの分離を直接侵害できないと仮定しても(以下で説明するプロセス/ uidの分離のため)、(共有)Javaコアクラスへの悪意のある調整により、あるアプリが別のアプリに干渉したり、別のアプリから情報を盗んだりする可能性があります。


問題は、無料のライブラリcode.google.com/p/json-simpleのクラスを使用してJSONRPCを操作し、String.isEmpty()メソッドを使用する関数JSONRPC2Message.parse(String arg0)があることです。アプリを実行すると、java.lang.noSuchMethodError例外が発生します。明確なライブラリからコードクラスに入れるようにEclipseを構成する方法がないと確信していますか?Android 2.1ライブラリからではなく、JREシステムライブラリからの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
これが選ばれた答えだと思います。UsintTextUtilsが最良のオプションです。同じようにするために独自の関数を作成する必要はありません。
Genaut 2015

あなたはあなたがちょうど書いたかもしれないことを知っていますよreturn (str == null || str.length() == 0);ね?
Piovezan 2016

@Piovezanはい、これも書くことができます
Shan Xeeshi 2016

4

私の知る限り、AndroidはJava 5をサポートしているisEmpty();ためlength()、シミュレーションに使用できるものはありません。isEmpty()


1

"" .equals(yourString); また、String.isEmpty()と同じ動作をします。


NullPointerExceptionも防止するため、実際には最良のソリューションです
Lukas

isEmptyを使用してnullと長さをチェックしている間、比較するたびに新しいStringオブジェクトを作成しているため、これは最善の解決策ではありません。
Genaut 2015

2
@ user1422434-いいえ、違います。VM全体の空の文字列リテラルを表すオブジェクトは1つだけです。
スティーブンC

しかし、私も@Lukasに同意しません。「NPEを防ぐ」ソリューションは、一般的に悪い考えです。より良いアイデアは、予期しないことnullがどこから来ているのかを把握し、その問題を修正することです。この"".equals(yourString)アプローチは、のnullyourStringが意味のあるものであり、期待される場合にのみ適切なソリューションです。
スティーブンC

-4

android APIをレベル9にアップグレードするString.trim().length()==0String.equals("")、を使用する必要があります。代わりに、androidAPIレベルとJDKバージョンで機能するはずです。


何?文字列" "は空ではありません!なぜ弦をトリミングすることを提案するのですか?
ruX 2014

1
@ruX" ".trim()は空になります!!! あなたもそれを知っていますか?あなたがあればダウン率はいけないしないでください、私の説明を理解します!
エンジンバイ

@Eugenie BaiString.trim().length()==0とすると、String.equals("")異なる結果が返されString = " "ます。2番目のスニペットは正しい
ruX 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.