首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查Java中的非空、非空字符串

检查Java中的非空、非空字符串
EN

Stack Overflow用户
提问于 2013-05-06 16:24:59
回答 7查看 61.2K关注 0票数 63

我正在尝试检查一个Java String是否不是null,不是空的,也不是空白的。

在我看来,这段代码应该非常适合这项工作。

代码语言:javascript
复制
public static boolean isEmpty(String s) {
    if ((s != null) && (s.trim().length() > 0))
        return false;
    else
        return true;
}

根据文档,String.trim()应该是这样工作的:

返回字符串的副本,省略了前导空格和尾随空格。

如果此String对象表示空字符序列,或者此String对象表示的字符序列的第一个和最后一个字符的代码都大于'\u0020' (空格字符),则返回对此String对象的引用。

但是,apache/commons/lang/StringUtils.java的做法略有不同。

代码语言:javascript
复制
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;
}

根据文档,Character.isWhitespace()

根据Java判断指定的字符是否为空格。当且仅当字符满足以下条件之一时,该字符才是Java空格字符:

  • 它是Unicode空格字符(SPACE_SEPARATORLINE_SEPARATORPARAGRAPH_SEPARATOR),但也不是不间断的空格('\u00A0''\u2007''\u202F').
  • It是'\t',水平TABULATION.
  • It是'\n'、U+000A换行符。
  • 它是'\u000B',U+000B垂直空格是'\f',U+000C换行符。<代码>H234<代码>H135它是D36,U+000D回车。
  • 它是D39,记录文件SEPARATOR.
  • It为'\u001D',组SEPARATOR.
  • It为'\u001E',记录U+001C SEPARATOR.
  • It为'\u001F',单元分隔符为U+001F。

如果我没有弄错--或者可能是我没有正确地阅读它-- String.trim()应该去掉Character.isWhiteSpace()正在检查的任何字符。它们看起来都在'\u0020'之上。

在本例中,较简单的isEmpty函数似乎涵盖了较长的isBlank所涵盖的所有场景。

在测试case?

  • Assuming中,是否有一个字符串可以使isEmptyisBlank的行为有所不同?没有,是否还有其他考虑因素,因此我应该选择isBlank而不使用isEmpty

对于那些对实际运行测试感兴趣的人,这里有一些方法和单元测试。

代码语言:javascript
复制
public class StringUtil {

    public static boolean isEmpty(String s) {
        if ((s != null) && (s.trim().length() > 0))
            return false;
        else
            return true;
    }

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

和单元测试

代码语言:javascript
复制
@Test
public void test() {
    
    String s = null; 
    assertTrue(StringUtil.isEmpty(s)) ;
    assertTrue(StringUtil.isBlank(s)) ;
    
    s = ""; 
    assertTrue(StringUtil.isEmpty(s)) ;
    assertTrue(StringUtil.isBlank(s)); 
    
    s = " "; 
    assertTrue(StringUtil.isEmpty(s)) ;
    assertTrue(StringUtil.isBlank(s)) ;
    
    s = "   "; 
    assertTrue(StringUtil.isEmpty(s)) ;
    assertTrue(StringUtil.isBlank(s)) ;
    
    s = "   a     "; 
    assertTrue(StringUtil.isEmpty(s)==false) ;    
    assertTrue(StringUtil.isBlank(s)==false) ;       
    
}

更新:这是一个非常有趣的讨论-这就是为什么我喜欢Stack Overflow和这里的人们。顺便说一句,回到问题上,我们得到:

  • 显示哪些字符会使行为不同的程序。代码在https://ideone.com/ELY5Wv。谢谢@dukeling.
  • 选择标准isBlank()的一个与性能相关的原因。感谢@nhahtdh对@devconsole.
  • A的全面解释。谢谢,伙计,
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16394787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档