一步检查空值和字符串是否为空

15

我有一个setter方法。

然后当另一个(比如生成)方法运行时,我需要检查我的字段的值。 对于String属性,我需要知道它是否包含该值或者是否未设置。 因此它可能为null、""或某些有意义的值,共有3种可能性。 而且首先检查null值相当无聊:

if (s != null)

对于一个空字符串

if (!s.isEmpty())

这里有一种简便的检查方法吗?你可以告诉我,我可以用空字符串初始化我的 String 字段。[ 这常见吗? ] 但是如果有人给 setter 方法 setS 传递了一个 null 值怎么办?

那么我们是否总是需要在使用对象之前检查对象值是否为 null 呢?是的,setter 方法可以检查其值,getter 方法也可以返回非空值以防字段为空。但这是唯一的解决方案吗?对程序员来说,在 getter 和 setter 中实现此功能太麻烦了!


1
是的,Apache库。 为什么它不在标准Java分发版中? - EugeneP
2
值得思考的是:null 表示未设置,"" 表示设置为空。 - Pat
同意Pat的观点。有时候看起来这只是不必要的繁文缛节,但它们在语义上是不同的。如果成员为null,则表示“没有值”,而空字符串则表示“有一个值;一个空字符串”。根据这个事实,方法通常会有不同的行为(按设计)。 - charstar
抱歉在评论区里发了这么多信息,但是由于它与主题有些关联,你可以通过让字符串字面量进行测试来避免对非空字符串进行检查和比较测试(字符串字面量仍然是字符串),例如"CheesySafeCompare".equals(someString)会像你想象的那样工作,但不会抛出NullPointerException。 - charstar
7个回答

17

1
小注释,您所描述的是 isNotBlank 和 isNotEmpty :) - EugeneP

5
if(s != null && !s.isEmpty()){
// this will work even if 's' is NULL
}

2
虽然这可以防止空指针异常,但这不是一个等价的测试:如果 s 为 null,则表达式解析为 true。这是一种安全的方式来测试 s 是否包含空字符串,但它并不测试 s 是否为空且 非 null。这个区别很重要! - Lorne Laliberte

4
在Jakarta Commons中,有一个StringUtils.isEmpty(String)函数。

1
使用 org.apache.commons.lang.StringUtils,方法 StringUtils.isNotBlank 检查空和空字符串。

0

添加Maven依赖项com.google.guava

然后在您的代码中:

import com.google.common.base.Strings;

if(!Strings.isNullOrEmpty(s)) {
  // Do stuff here
}

0

如果你正在进行安卓开发,你可以使用:

TextUtils.isEmpty (CharSequence str) 

自 API 级别 1 开始添加 如果字符串为 null 或长度为 0,则返回 true。


0

春天

Spring提供了类org.springframework.util.StringUtils,其中包含了以下相关方法。

hasText(String s)

当且仅当一个StringCharSequence包含非空格字符时,返回true。

示例:

 StringUtils.hasText(null) = false
 StringUtils.hasText("") = false
 StringUtils.hasText(" ") = false
 StringUtils.hasText("12345") = true
 StringUtils.hasText(" 12345 ") = true

hasLength(String s)

如果一个StringCharSequence包含任何字符(包括空格),则返回true。

示例:

 StringUtils.hasLength(null) = false
 StringUtils.hasLength("") = false
 StringUtils.hasLength(" ") = true
 StringUtils.hasLength("Hello") = true

在这个问题的情况下,hasText 是最好的选择。

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