检查字符串是否不为空且不为空


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
您可以创建将检查空值或空对象的类。这将帮助你提高复用能力.. stackoverflow.com/a/16833309/1490962
Bhushankumar Lilapara

Answers:


895

isEmpty()呢?

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

确保&&按此顺序使用的部分,因为如果第一部分&&失败,java将不会继续评估第二部分,因此确保您不会从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()),以忽略空格。
2013年

if((txt.getText()。length())== 0)//从布局中获取元素
jruzafa 2014年

32
我建议使用TextUtils.isEmpty(String)检查字符串为空还是空。好又短。TextUtils类是Android SDK的一部分。
George Maisuradze 2014年

1
@ user1154390:有时为了清楚起见,使用true和false明确指定其值,但是当condition返回true表示true和false表示false时,则不必要的复杂性。简单地说(str != null && str.length() > 0)
ToolmakerSteve

213

使用org.apache.commons.lang.StringUtils

我喜欢将Apache commons-lang用于这类事情,尤其是StringUtils实用程序类:

import org.apache.commons.lang.StringUtils;

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

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

17
如果您仅可以使用isEmpty,Apache commons-lang就是不是一个过大的杀手?只是好奇。
zengr 2010年

17
@zengr-不,因为您肯定还会使用其他方法:)
Bozho 2010年

2
@zengr的确,如果仅使用isEmptyisBlank,则包括第三方库可能没有用。您可以简单地创建自己的实用程序类来提供这种方法。但是,正如Bozho解释的那样,该commons-lang项目提供了许多有用的方法!
罗曼·林索拉斯

13
因为StringUtils.isNotBlank(str)也进行null检查。
sdesciencelover

1
如果您使用Spring Framework,则可以将其捆绑在框架的jar中。
linuxunil '18 -10-25

103

只需在此处添加Android:

import android.text.TextUtils;

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

1
@staticx,在Lang版本2.0中更改了StringUtils方法。它不再修剪CharSequence。该功能在isBlank()中可用。
尼克

50

添加到@BJorn和@SeanPatrickFloyd Guava的方法是:

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

Commons Lang有时更具可读性,但是我一直在慢慢地更多地依赖Guava,有时候,Commons Lang涉及到混乱isBlank()(无论是否为空白)。

番石榴的Commons Lang版本为isBlank

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

我要说的代码,不允许""(空)AND null是可疑,因为它可能不处理在不使所有的情况下可能马车null是有道理的(尽管SQL我可以理解为SQL / HQL是奇怪约'')。


第二个番石榴也是。番石榴遵循多个静态类的约定。对于String,请为静态方法(如isNullOrEmpty(str))尝试使用Strings。
2015年

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

或者

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

要么

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

注意:第二个检查(第一个和第二个选择)假定str不为null。没关系,因为第一次检查是这样做的(如果第一次检查为false,Java不会进行第二次检查)!

重要说明:请勿将==用于字符串相等。==检查指针是否相等,而不是值。两个字符串可以位于不同的内存地址(两个实例)中,但具有相同的值!


谢谢... str.length()为我工作。我的情况是我从数据库查询后从数组中获取值。即使数据为空,当我执行str.length时,它的长度也为“ 1”。非常奇怪,但感谢您向我展示。
arn-arn 2015年

这与数据库的内部有关。它是一个char字段而不是varchar字段(因此它用空格填充),或者数据库不喜欢空字符串。我猜最好是在查询后/查询时对这些值进行预处理(在应用程序的稍后数据访问中)。
helios 2015年

我认为检查长度比“等于”更好,因为它是O(1)操作,因为在String的情况下会缓存长度。
bluelurker

26

我知道的几乎每个库都定义了一个称为 StringUtilsStringUtil或者StringHelper,他们通常包括你正在寻找的方法。

我个人最喜欢的是Apache Commons / Lang,在 StringUtils类中,

  1. StringUtils.isEmpty(String)
  2. StringUtils.isBlank(字符串)方法

(第一个检查字符串是否为null或为空,第二个检查字符串是否为null,为空或仅空格)

Spring,Wicket和许多其他库中有类似的实用程序类。如果您不使用外部库,则可能要在自己的项目中引入StringUtils类。


更新:很多年过去了,这些天我建议使用GuavaStrings.isNullOrEmpty(string)方法。


我想问你为什么现在推荐这个?我想知道Strings.isNullOrEmpty(string)和StringUtils.isEmpty(String)之间是否有区别
vicangel

@vicangel Apache Commons方法充满了假设和我没有要求的东西。有了番石榴,我就能得到我真正想要的东西,或多或少
肖恩·帕特里克·弗洛伊德

24

这对我有用:

import com.google.common.base.Strings;

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

如果给定的字符串为null或为空字符串,则返回true。

考虑使用nullToEmpty标准化字符串引用。如果这样做,则可以使用String.isEmpty()代替此方法,并且您也不需要特殊的以空值表示形式的方法,例如String.toUpperCase。或者,如果您希望“从另一个方向”进行标准化,则将空字符串转换为null,则可以使用emptyToNull。


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

11

怎么样:

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

如果str为NULL,则抛出NullPointerException。
Mindwin

13
@Mindwin这不是真的。它不会执行&&if str == null 右边的代码,从而防止了NullPointerException。(来源:我刚刚尝试过)
Zach Lysobey

我站得住了。不会因为羞耻而删除评论,因此Zach和GI Joe不会无所适从。哈哈 但很高兴知道,如果您执行其他操作而不只是测试东西,并且在跳过的方法调用上返回布尔值,则这种跳过可能会导致逻辑失败。
2014年

2
@Mindwin很高兴知道您使用的语言是如何工作的。如果您不了解短路评估,请不要使用它,或者更好地了解它。
罗恩侯爵

7

使用Apache StringUtils的isNotBlank方法,例如

StringUtils.isNotBlank(str)

仅当str不为null且不为空时,它将返回true。


实际上,如果str在此处为null,则该语句返回true
亚历山大

没错,我的坏人!而是使用apache-commons的StringUtils.isNotEmpty(str)来完成这项工作。
空指针

6

您应该使用org.apache.commons.lang3.StringUtils.isNotBlank()org.apache.commons.lang3.StringUtils.isNotEmpty。两者之间的决定取决于您实际要检查的内容。

所述isNotBlank()检查该输入参数是:

  • 不是空
  • 不是空字符串(“”)
  • 不是空格字符序列(“”)

所述isNotEmpty()检查仅输入参数是

  • 不为空
  • 不是空字符串(“”)

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);
bachph

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

字符串#is空白


3

测试等于空字符串,并且在相同条件下为null:

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

NullPointerException如果str为null,则不抛出Object.equals()错误,因为如果arg为,则返回false null

另一个结构str.equals("")会抛出恐惧NullPointerException。有些人可能会认为使用String文字的不良形式equals()是调用wich时的对象,但是它确实起作用。

还要检查此答案: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非常适合此操作,如果要包含番石榴,则应执行以下操作:

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

我还可以建议您按名称而不是按索引引用结果集中的列,这将使您的代码更易于维护。


尽管无需使用来自番石榴的apache commons,但番石榴中也有Strings类:guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/…–
肖恩·帕特里克·弗洛伊德

我为落入此问题的Java新手添加了一些Guava示例:stackoverflow.com/a/13146903/318174
亚当·根特

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

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 Optional,您可以执行以下操作:

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

在此表达式中,您还将处理String由空格组成的。


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
Brian

1

我会根据您的实际需求建议Guava或Apache Commons。检查示例代码中的不同行为:

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)

返回:如果String不为null且具有长度,则返回true

以及方法

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

返回:如果String不为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);

此方法接受任何Object作为参数,将其与null和空String进行比较。因此,对于非null非String对象,此方法将永远不会返回true。


1
请注意,该文档StringUtils明确指出“主要供框架内部使用;考虑使用Apache的Commons Lang获得更全面的String实用程序套件”。
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;
}

如果所有String字段值均为空白,则此方法将返回true;如果String属性中存在任何一个值,则此方法将返回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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.