文字列がnullでも空でもないことを確認する


490

文字列がnullでも空でもないことを確認するにはどうすればよいですか?

public void doStuff(String str)
{
    if (str != null && str != "**here I want to check the 'str' is empty or not**")
    {
        /* handle empty string */
    }
    /* ... */
}

8
PreparedStatement文字列連結プリミティブでSQLクエリを構築する代わりに、などを使用する必要があります。あらゆる種類のインジェクションの脆弱性を回避し、はるかに読みやすくするなど
polygenelubricants

2
null値またはnullオブジェクトをチェックするクラスを作成できます。これは、再利用性の向上に役立ちます。.. stackoverflow.com/a/16833309/1490962
Bhushankumar Lilapara

回答:


895

どの程度のisEmpty()

if(str != null && !str.isEmpty())

&&の最初の部分が&&失敗した場合、javaは2番目の部分の評価に進まず、したがってstr.isEmpty()if strがnull からnullポインタ例外を取得しないようにするため、この順序で必ずの部分を使用してください。

注意してください、それはJava SE 1.6以降でのみ利用可能です。str.length() == 0以前のバージョンを確認する必要があります。


空白も無視するには:

if(str != null && !str.trim().isEmpty())

(Java 11 str.trim().isEmpty()str.isBlank()他のUnicode空白もテストするように縮小できるため)

便利な関数に包まれています:

public static boolean empty( final String s ) {
  // Null-safe, short-circuit evaluation.
  return s == null || s.trim().isEmpty();
}

になる:

if( !empty( str ) )

80
isEmpty()Stringインスタンスを必要とするように見えることに注意してください(非静的)。null参照でこれを呼び出すと、NullPointerExceptionがスローされます。
James P.

38
または、if(str!= null &&!str.trim()。isEmpty())で空白を無視します。
PapaFreud 2013年

if((txt.getText()。length())== 0)//レイアウトから要素を取得
jruzafa 2014

32
TextUtils.isEmpty(String)文字列が空かnullかを確認するために使用することをお勧めします。素敵で短い。TextUtilsクラスはAndroid SDKの一部です。
George Maisuradze 2014年

1
@ user1154390:明確にするためにtrueとfalseを明示的に使用する価値がある場合がありますが、条件がtrueに対してtrueを返し、falseに対してfalseを返す場合、不要な複雑さになります。単に言う(str != null && str.length() > 0)
ToolmakerSteve 2015

213

org.apache.commons.lang.StringUtilsを使用します

私はこれらの種類のもの、特にStringUtilsユーティリティクラスにApache commons-langを使用するのが好きです:

import org.apache.commons.lang.StringUtils;

if (StringUtils.isNotBlank(str)) {
    ...
} 

if (StringUtils.isBlank(str)) {
    ...
} 

17
isEmptyだけを使用できる場合、Apache commons-langはやりすぎではありませんか?ちょっと興味があるんだけど。
zengr

17
@zengr-いいえ、間違いなく他のものも使用するからです:)
Bozho

2
@zengr確かに、isEmptyまたはのみを使用する場合isBlank、サードパーティのライブラリを含めることはおそらく役に立たないでしょう。独自のユーティリティクラスを作成して、そのようなメソッドを提供できます。しかし、Bozhoが説明するように、このcommons-langプロジェクトは多くの便利な方法を提供します!
Romain Linsolas、2010

13
のではStringUtils.isNotBlank(str)同様ヌル検査を行いません。
sdesciencelover 2013年

1
Spring Frameworkを使用する場合、これはすでにフレームワークのjarファイルにバンドルされている可能性があります。
linuxunil 2018年

103

ここにAndroidを追加するだけです:

import android.text.TextUtils;

if (!TextUtils.isEmpty(str)) {
...
}

1
@ staticx、StringUtilsメソッドはLangバージョン2.0で変更されました。CharSequenceをトリミングしなくなりました。その機能はisBlank()で利用できます。
Nick

50

@BJornと@SeanPatrickFloydに追加するには、次のようにします。

Strings.nullToEmpty(str).isEmpty(); 
// or
Strings.isNullOrEmpty(str);

コモンズラングの方が読みやすい場合がありますが、ゆっくりとグアバに頼っています。さらに、コモンズラングは混乱することがあります isBlank()(空白文字の有無など)。

Commons LangのGuavaのバージョンisBlankは次のようになります。

Strings.nullToEmpty(str).trim().isEmpty()

許可しない""(空の)AND null疑わしくてバグの可能性があるコードは、おそらく許可しないすべてのケースを処理しないのでnull(SQLの場合、SQL / HQLは奇妙なので理解できますが'')。


2番目のグアバも。グアバは複数の静的クラスの規約に従います。文字列の場合、isNullOrEmpty(str)などの静的メソッドの文字列を試してください。
トゥッテン、2015年

34
str != null && str.length() != 0

あるいは

str != null && !str.equals("")

または

str != null && !"".equals(str)

注:2番目のチェック(1番目と2番目の選択肢)では、strがnullでないことを前提としています。最初のチェックがそれを実行している(そして、最初のチェックがfalseの場合、Javaは2番目のチェックを実行しない)だけで問題ありません!

重要:文字列の等価性のために==を使用しないでください。==ポインタが値ではなく等しいかどうかをチェックします。2つの文字列は異なるメモリアドレス(2つのインスタンス)に存在できますが、値は同じです!


ありがとう... str.length()は私のために働いた。私の場合は、データベースからクエリを実行した後、配列から値を取得しています。データが空の場合でも、str.lengthを実行すると、「1」の長さが得られました。とても奇妙ですが、これを見せてくれてありがとう。
-

それはデータベースの内部に関係しています。varcharフィールドではなくcharフィールドである(スペースが埋め込まれる)か、データベースが空の文字列を好みません。私は、(アプリの後でデータアクセスで)クエリの実行中/実行中にこれらの値を前処理するのが最善だと思います。
helios 2015年

文字列の場合は長さがキャッシュされるため、O(1)操作であるため、長さをチェックすることは「等しい」よりも良いと思います。
bluelurker

26

私が知っているほとんどすべてのライブラリはStringUtilsStringUtilまたはと呼ばれるユーティリティクラスを定義し、StringHelperそれらには通常、探しているメソッドが含まれています。

私の個人的な好みはあるのApache Commonsの/ラングで、のStringUtilsのクラス、あなたは両方の取得します

  1. StringUtils.isEmpty(String)
  2. StringUtils.isBlank(String)メソッド

(1つ目は文字列がnullまたは空かどうかをチェックし、2つ目はnull、空、または空白のみかどうかをチェックします)

Spring、Wicket、およびその他の多くのライブラリには、同様のユーティリティクラスがあります。外部ライブラリを使用しない場合は、独自のプロジェクトにStringUtilsクラスを導入することができます。


更新:何年も経ちましたが、最近ではGuavaStrings.isNullOrEmpty(string)方法を使用することをお勧めします。


なぜ今これをお勧めするのですか?Strings.isNullOrEmpty(string)とStringUtils.isEmpty(String)の間に違いがあるかどうか知りたい
vicangel '20

@vicangel Apache Commonsのメソッドには、前提条件と、私が要求しなかったことがたくさんあります。グアバを使用すると、求めていたものを正確に入手できますが、多かれ少なかれ何もありません
ショーンパトリックフロイド

24

これは私にとってはうまくいきます:

import com.google.common.base.Strings;

if (!Strings.isNullOrEmpty(myString)) {
       return myString;
}

指定された文字列がnullまたは空の文字列の場合、trueを返します。

nullToEmptyを使用して文字列参照を正規化することを検討してください。その場合は、このメソッドの代わりにString.isEmpty()を使用できます。また、String.toUpperCaseなどのメソッドのnullセーフな特別な形式も必要ありません。または、「反対方向」に正規化して空の文字列をnullに変換する場合は、emptyToNullを使用できます。


2
<dependency> <groupId> com.google.guava </ groupId> <artifactId> guava </ artifactId> <version> 12.0 </ version> </ dependency>
Junchen Liu 2014

11

どうですか:

if(str!= null && str.length() != 0 )

strがNULLの場合、NullPointerExceptionをスローします。
Mindwin 2013年

13
@Mindwinそれは本当ではない。&&if str == nullの右側のコードは実行されないため、NullPointerExceptionが発生しません。(情報源:私が試したところ)
Zach Lysobey 2013

私は修正された立場です。恥ずかしくないコメントを削除しないでください。そうすれば、ZachとGI Joeがどこからともなく応答を停止することはありません。Lolz。ただし、テストを行うだけでなく、スキップしたメソッド呼び出しでブール値を返す場合、このスキップが論理的な障害を引き起こす可能性があることを知っておくと便利です。
マインドウィン2014

2
@Mindwin使用している言語が実際にどのように機能するかを知るのは素晴らしいことです。短絡評価を理解していない場合は、それを使用しないか、または、よりよく、それについて学習してください。
ローンの侯爵

7

Apache StringUtilsのisNotBlankメソッドを使用します。

StringUtils.isNotBlank(str)

strがnullでなく、空でない場合にのみtrueを返します。


実際、ここでstrがnullの場合、ステートメントはtrueを返します
Alexandr

それは本当です、私の悪い!! 代わりに、apache-commonsのStringUtils.isNotEmpty(str)を使用することで機能します。
Nullポインタ

6

org.apache.commons.lang3.StringUtils.isNotBlank()またはを使用してくださいorg.apache.commons.lang3.StringUtils.isNotEmpty。これら2つの間の決定は、実際に確認したいことに基づいています。

isNotBlank()の入力パラメータであることをチェックします。

  • Nullではなく、
  • 空の文字列( "")ではありません
  • 一連の空白文字( "")ではありません

isNotEmpty()の入力パラメータであることだけをチェックします

  • nullではない
  • 空の文字列( "")ではありません

6

入力に基づいてtrueまたはfalseを返します

Predicate<String> p = (s)-> ( s != null && !s.isEmpty());
p.test(string);

5

ライブラリ全体を含めたくない場合は、そこから必要なコードを含めるだけです。自分で保守する必要があります。しかし、これはかなり単純な関数です。ここではcommons.apache.orgからコピーされます

    /**
 * <p>Checks if a String is whitespace, empty ("") or null.</p>
 *
 * <pre>
 * StringUtils.isBlank(null)      = true
 * StringUtils.isBlank("")        = true
 * StringUtils.isBlank(" ")       = true
 * StringUtils.isBlank("bob")     = false
 * StringUtils.isBlank("  bob  ") = false
 * </pre>
 *
 * @param str  the String to check, may be null
 * @return <code>true</code> if the String is null, empty or whitespace
 * @since 2.0
 */
public static boolean isBlank(String str) {
    int strLen;
    if (str == null || (strLen = str.length()) == 0) {
        return true;
    }
    for (int i = 0; i < strLen; i++) {
        if ((Character.isWhitespace(str.charAt(i)) == false)) {
            return false;
        }
    }
    return true;
}

5

少し手遅れですが、チェックの機能的なスタイルを次に示します。

Optional.ofNullable(str)
    .filter(s -> !(s.trim().isEmpty()))
    .ifPresent(result -> {
       // your query setup goes here
    });

1
トリミングにマップを使用することをお勧めします。例:Optional.ofNullable(str).map(String :: trim).filter(String :: isEmpty).ifPresent(this :: setStringMethod);
バッフフ

5

新しい方法があります String#isBlank

文字列が空であるか空白コードポイントのみが含まれている場合はtrueを返し、それ以外の場合はfalseを返します。

jshell> "".isBlank()
$7 ==> true

jshell> " ".isBlank()
$8 ==> true

jshell> " ! ".isBlank()
$9 ==> false

これを組み合わせてOptional、文字列がnullまたは空かどうかを確認できます

boolean isNullOrEmpty = Optional.ofNullable(str).map(String::isBlank).orElse(true);

String#isBlank


3

テストは、同じ条件で空の文字列とnullと等しい:

if(!"".equals(str) && str != null) {
    // do stuff.
}

argがfalseの場合はfalseを返すNullPointerExceptionため、strがnullの場合はスローしません。Object.equals()null

他の構成str.equals("")は恐ろしいものを投げNullPointerExceptionます。一部の人は、文字列リテラルを使用したオブジェクトをequals()呼び出すときに不適切な形式を検討するかもしれませんが、それは機能します。

また、この回答を確認してください:https : //stackoverflow.com/a/531825/1532705


1
では、なぜ到達しないコードを追加するのかstr != null!"".equals(str)すでに仕事をしている
amdev

3

簡単な解決策:

private boolean stringNotEmptyOrNull(String st) {
    return st != null && !st.isEmpty();
}

2

Seanizerが上で述べたように、Apache StringUtilsはこれに最適です。guavaを含める場合は、以下を実行する必要があります。

public List<Employee> findEmployees(String str, int dep) {
 Preconditions.checkState(StringUtils.isNotBlank(str), "Invalid input, input is blank or null");
 /** code here **/
}

また、結果セットの列をインデックスではなく名前で参照することをお勧めします。これにより、コードの保守がはるかに容易になります。


けれどもグアバからapacheのコモンズを使用する必要はありません、あまりにもグアバの文字列クラスが存在しない:guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/...
ショーン・パトリック・フロイド

私はこの質問に到達した初心のJavaユーザー向けにいくつかのGuavaの例を追加しました:stackoverflow.com/a/13146903/318174
Adam Gent

2

ifステートメントをで一杯にするのではなく、複数の文字列を一度にチェックする独自のユーティリティ関数を作成しましたif(str != null && !str.isEmpty && str2 != null && !str2.isEmpty)。これは関数です:

public class StringUtils{

    public static boolean areSet(String... strings)
    {
        for(String s : strings)
            if(s == null || s.isEmpty)
                return false;

        return true;
    }   

}

だから私は単に書くことができます:

if(!StringUtils.areSet(firstName,lastName,address)
{
    //do something
}

2
署名を使用することがよりよいであろう:areSet(String... strings)次に、アレイの作成せずに呼び出すことができる:if(!StringUtils.areSet(firstName, lastName, address))
ウェストン

2

Java 8を使用していて、より機能的なプログラミングアプローチが必要なFunction場合は、コントロールを管理するを定義して、apply()必要なときにいつでもコントロールを再利用できます。

練習に来て、あなたはFunctionとして定義することができます

Function<String, Boolean> isNotEmpty = s -> s != null && !"".equals(s)

次に、apply()メソッドを次のように呼び出すだけで使用できます。

String emptyString = "";
isNotEmpty.apply(emptyString); // this will return false

String notEmptyString = "StackOverflow";
isNotEmpty.apply(notEmptyString); // this will return true

必要にFunction応じて、Stringが空かどうかをチェックし、それをで否定するを定義できます!

この場合、は次のFunctionようになります。

Function<String, Boolean> isEmpty = s -> s == null || "".equals(s)

次に、apply()メソッドを次のように呼び出すだけで使用できます。

String emptyString = "";
!isEmpty.apply(emptyString); // this will return false

String notEmptyString = "StackOverflow";
!isEmpty.apply(notEmptyString); // this will return true

これは、パフォーマンスコストや副作用が心配で、すぐにインポートできるインポートがない場合に、私が行う方法です。
david.pfx

2

Javaの8オプションあなたが行うことができます。

public Boolean isStringCorrect(String str) {
    return Optional.ofNullable(str)
            .map(String::trim)
            .map(string -> !str.isEmpty())
            .orElse(false);
}

この式でStringは、スペースで構成されるsも処理します。


1

StringUtils.isEmpty()を使用できます。文字列がnullまたは空の場合はtrueになります。

 String str1 = "";
 String str2 = null;

 if(StringUtils.isEmpty(str)){
     System.out.println("str1 is null or empty");
 }

 if(StringUtils.isEmpty(str2)){
     System.out.println("str2 is null or empty");
 }

結果になります

str1がnullまたは空です

str2はnullまたは空です


または単に使用isNotBlank
ブライアン

1

実際のニーズに応じて、グアバまたはアパッチコモンズに助言します。私のコード例のさまざまな動作を確認してください:

import com.google.common.base.Strings;
import org.apache.commons.lang.StringUtils;

/**
 * Created by hu0983 on 2016.01.13..
 */
public class StringNotEmptyTesting {
  public static void main(String[] args){
        String a = "  ";
        String b = "";
        String c=null;

    System.out.println("Apache:");
    if(!StringUtils.isNotBlank(a)){
        System.out.println(" a is blank");
    }
    if(!StringUtils.isNotBlank(b)){
        System.out.println(" b is blank");
    }
    if(!StringUtils.isNotBlank(c)){
        System.out.println(" c is blank");
    }
    System.out.println("Google:");

    if(Strings.isNullOrEmpty(Strings.emptyToNull(a))){
        System.out.println(" a is NullOrEmpty");
    }
    if(Strings.isNullOrEmpty(b)){
        System.out.println(" b is NullOrEmpty");
    }
    if(Strings.isNullOrEmpty(c)){
        System.out.println(" c is NullOrEmpty");
    }
  }
}

結果:
Apache:
aは空白
bは空白
cは空白
Google:
bはNullOrEmpty
cはNullOrEmpty


1

あなたがSpring Bootを使用しているなら、以下のコードが仕事をします

StringUtils.hasLength(str)

0

完全を期すため:すでにSpringフレームワークを使用している場合、StringUtilsメソッドを提供します

org.springframework.util.StringUtils.hasLength(String str)

文字列がnullでなく、長さがある場合はtrue

同様に方法

org.springframework.util.StringUtils.hasText(String str)

戻り値:文字列がnullではなく、長さが0より大きく、空白のみが含まれていない場合はtrue


StringUtils.isEmpty(param)メソッドを使用できます。
Supun Dharmarathne、

0

単に、空白も無視するには:

if (str == null || str.trim().length() == 0) {
    // str is empty
} else {
    // str is not empty
}

0

Springフレームワークを使用している場合は、メソッドを使用できます。

org.springframework.util.StringUtils.isEmpty(@Nullable Object str);

このメソッドは、任意のオブジェクトを引数として受け入れ、それをnullおよび空の文字列と比較します。結果として、このメソッドは、null以外の非文字列オブジェクトに対してtrueを返すことはありません。


1
のドキュメントにStringUtilsは、「主にフレームワーク内での使用を目的としています。より包括的な文字列ユーティリティスイートについては、ApacheのCommons Langを検討してください」と明記されていることに注意してください。
FredrikJonsén18年

0

文字列でnullを処理するより良い方法は、

str!=null && !str.equalsIgnoreCase("null") && !str.isEmpty()

要するに、

str.length()>0 && !str.equalsIgnoreCase("null")

0

オブジェクトのすべての文字列属性が空であるかどうかを確認するには(JavaリフレクションAPIアプローチに従ってすべてのフィールド名に!= nullを使用する代わりに)

private String name1;
private String name2;
private String name3;

public boolean isEmpty()  {

    for (Field field : this.getClass().getDeclaredFields()) {
        try {
            field.setAccessible(true);
            if (field.get(this) != null) {
                return false;
            }
        } catch (Exception e) {
            System.out.println("Exception occurred in processing");
        }
    }
    return true;
}

このメソッドは、すべての文字列フィールド値が空白の場合はtrueを返し、文字列属性にいずれかの値が存在する場合はfalseを返します。


0

「null」(文字列として)を空と見なす必要があることを確認する必要がある状況に遭遇しました。また、空白と実際のnullはtrueを返す必要があります。ようやく次の機能に落ち着きました...

public boolean isEmpty(String testString) {
  return ((null==testString) || "".equals((""+testString).trim()) || "null".equals((""+testString).toLowerCase()));
}

0

メソッドのパラメーターを検証する必要がある場合は、シンプルなメソッドに従ってください

public class StringUtils {

    static boolean anyEmptyString(String ... strings) {
        return Stream.of(strings).anyMatch(s -> s == null || s.isEmpty());
    }

}

例:

public String concatenate(String firstName, String lastName) {
    if(StringUtils.anyBlankString(firstName, lastName)) {
        throw new IllegalArgumentException("Empty field found");
    }
    return firstName + " " + lastName;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.