检查一个字符串是否既不为null也不为空。

561

如何检查一个字符串既不是 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
你可以创建一个类来检查空值或空对象。这将有助于提高可重用性。http://stackoverflow.com/a/16833309/1490962 - Bhushankumar Lilapara
此条件可以用java.util.function.Predicate表达,如下所示:Predicate.<String>isEqual(null).or(String::isEmpty).negate(),具体解释请参考这里 - Alexander Ivanchenko
35个回答

996

那么 isEmpty() 方法呢?

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

请确保按照此顺序使用&&的不同部分,因为如果&&的第一个部分失败,Java将不会继续评估第二个部分,从而确保在str为空时,您不会从str.isEmpty()收到空指针异常。

请注意,此方法仅适用于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 ) )

83
请注意,isEmpty() 方法需要一个字符串实例(非静态)。在空引用上调用此方法将抛出 NullPointerException 异常。 - James P.
39
如果(str != null && !str.trim().isEmpty()),则忽略空格。 - PapaFreud
37
我推荐使用 TextUtils.isEmpty(String) 来检查字符串是否为空或为 null。这一方法简短明了,并且 TextUtils 类是 Android SDK 的一部分。 - George Maisuradze
布尔值 check = (yourstring != null) ? (yourstring.length() > 0 ? true : false) : false; - user1154390
1
有时候为了清晰明了,值得明确地使用 true 和 false,但当条件返回 true 表示真,false 表示假时,这是不必要的复杂性。只需说 (str != null && str.length() > 0) 即可。 - ToolmakerSteve
显示剩余2条评论

244

22
如果你可以使用isEmpty,那么使用Apache commons-lang是否太过繁琐?只是好奇。 - zengr
21
不,因为你肯定也会使用其他东西 :) - Bozho
2
@zengr确实,如果你只使用isEmptyisBlank,也许不需要包含第三方库。你可以简单地创建自己的实用程序类来提供这样的方法。然而,正如Bozho所解释的那样,commons-lang项目提供了许多有用的方法! - Romain Linsolas
16
因为 StringUtils.isNotBlank(str) 同时也会进行空值检查。 - sdesciencelover
4
如果您使用Spring Framework,这可能已经包含在框架的JAR包中了。 - linuxunil
1
如果您的应用程序已经在使用这个Apache Commons,那就没问题了。请注意,还有一个Apache Commons lang3 org.apache.commons.lang3.StringUtils.isNotBlank - javaPlease42

106

在这里只是加入了Android:

import android.text.TextUtils;

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

1
@staticx,StringUtils方法在Lang版本2.0中有所改变。它不再修剪CharSequence。这个功能可以在isBlank()中使用。 - Nick

52

补充@BJorn和@SeanPatrickFloyd的话,使用Guava的方法是:

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

有时候Commons Lang更易读,但我已经逐渐更加依赖Guava,有时候Commons Lang在使用isBlank()时会让人感到困惑(比如什么是空格或非空格)。

Guava的版本的Commons Lang isBlank如下:

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

我认为写出不允许""(空字符串) null的代码可能存在问题并且可能存在漏洞,因为它可能没有处理所有情况,其中不允许null是有意义的(尽管对于SQL我可以理解,因为SQL/HQL对''很奇怪)。


Guava也是如此。Guava遵循复数静态类的约定。对于String,尝试使用Strings来调用静态方法,例如isNullOrEmpty(str)。 - Thupten

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

或者说

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

注意:第二个检查(第一和第二种情况)假设str不为null。这样做是可以的,因为第一个检查已经做了这个判断(如果第一个检查为false,则Java不会执行第二个检查)!

重要提示:不要使用==来比较字符串相等性。==比较指针是否相等,而非值。两个字符串可以存在于不同的内存地址(两个实例),但具有相同的值!


谢谢...str.length()对我有用。我的情况是,我从数据库查询后从数组中获取值。即使数据为空,当我执行str.length时,它也会给出“1”的长度。非常奇怪,但感谢您向我展示这个。 - arn-arn
这与数据库的内部有关。可能是字符字段而不是变长字符字段(因此会填充空格),或者数据库不喜欢空字符串。我想最好的方法是在查询后/同时预处理这些值(在应用程序的数据访问层)。 - helios
我认为检查长度比使用“equals”更好,因为在字符串的情况下,它是O(1)操作,因为长度被缓存。 - bluelurker

29
几乎我所知道的每个库都定义了一个实用类,叫做StringUtilsStringUtilStringHelper,它们通常包括你要查找的方法。
我的个人喜好是Apache Commons / Lang,在StringUtils类中,你可以得到两个方法:
  1. StringUtils.isEmpty(String)
  2. StringUtils.isBlank(String)
(第一个检查字符串是否为空或null,第二个检查字符串是否为null、为空或仅包含空格)
Spring、Wicket和许多其他库中也有类似的实用程序类。如果你不使用外部库,你可能想在自己的项目中引入一个StringUtils类。

更新:多年过去了,现在我建议使用GuavaStrings.isNullOrEmpty(string)方法。


我想问一下,为什么你现在推荐这个?我想知道 Strings.isNullOrEmpty(string) 和 StringUtils.isEmpty(String) 之间有什么区别。 - vicangel
@vicangel Apache Commons 的方法充满了假设和我没有要求的东西。使用 Guava,我得到了我所要求的正好而且仅此而已。 - Sean Patrick Floyd

25

这对我有效:

import com.google.common.base.Strings;

if (!Strings.isNullOrEmpty(myString)) {
       return myString;
}
如果给定字符串为 null 或空字符串,则返回 true。
考虑使用 nullToEmpty 规范化您的字符串引用,这样做可以使用 String.isEmpty() 替代此方法,并且您也不需要像 String.toUpperCase 这样的特殊空安全形式的方法。或者,如果您想要将空字符串规范化为 null,则可以使用 emptyToNull。

3
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>12.0</version> </dependency> 这段文字是一个Java代码中的依赖项,指明了需要引用Google Guava库的版本号为12.0。 - Junchen Liu

17

中有一个新的方法: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);

{{link1:String#isBlank}}


10

可以这样试试:

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

1
如果str为NULL,则抛出NullPointerException。 - Mindwin Remember Monica
14
@Mindwin 这不是真的。如果 str == null,则不会执行 && 右侧的代码,从而防止出现 NullPointerException 异常。(来源:我刚试过) - Zach Lysobey
1
我改正了。不会因为羞愧而删除评论,这样 Zach 和 GI Joe 就不会被留下无处回应的情况。哈哈。但是很高兴知道,如果您在跳过方法调用时做其他事情并返回布尔值,则可能会导致逻辑故障。 - Mindwin Remember Monica
3
很高兴知道你正在使用的语言是如何实际运作的。如果你不理解短路求值,请不要使用它,或者更好的办法是去学习一下。 - user207421

9

完整性考虑:如果您已经使用Spring框架,则StringUtils提供了该方法

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

返回值: 如果字符串不为空且长度大于0,则返回true

同时还有该方法的说明:

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

返回值: 如果字符串不为null,长度大于0且不仅包含空格,则返回true。

我们可以使用StringUtils.isEmpty(param)方法。 - Supun Dharmarathne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接