文档章节

在判断字符串是否为空值时应避免使用String.trim()

Hazelnut
 Hazelnut
发布于 2013/08/09 09:27
字数 464
阅读 413
收藏 0

工作中经常可以看到下面的代码片段:


if (str == null || str.trim().length() == 0) {
    ......
}
这段代码的作用是判断一个字符串是否为空值。代码虽简单,但这种方式有个问题:使用了trim()方法。


trim()方法本身没什么不好,只是被用错了地方。

我们看看trim()是怎么工作的。

public String trim() {
	int len = count;
	int st = 0;
	int off = offset;      /* avoid getfield opcode */
	char[] val = value;    /* avoid getfield opcode */

	while ((st < len) && (val[off + st] <= ' ')) {
	    st++;
	}
	while ((st < len) && (val[off + len - 1] <= ' ')) {
	    len--;
	}
	return ((st > 0) || (len < count)) ? substring(st, len) : this;
    }

public String substring(int beginIndex, int endIndex) {
	if (beginIndex < 0) {
	    throw new StringIndexOutOfBoundsException(beginIndex);
	}
	if (endIndex > count) {
	    throw new StringIndexOutOfBoundsException(endIndex);
	}
	if (beginIndex > endIndex) {
	    throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
	}
	return ((beginIndex == 0) && (endIndex == count)) ? this :
	    new String(offset + beginIndex, endIndex - beginIndex, value);
    }
可以看到, 当字符串前后有空白字符时,trim()会生成一个新的String对象。

我们可以直接使用apache commons lang包中的StringUtils类的isEmpty()或isBlank()方法来判断字符串是否为空。

如果你不想引入第三方的jar包,想要自己实现,那么也可以参考apache的实现方式:

* <p>Checks if a CharSequence is empty ("") or null.</p>
     *
     * <pre>
     * StringUtils.isEmpty(null)      = true
     * StringUtils.isEmpty("")        = true
     * StringUtils.isEmpty(" ")       = false
     * StringUtils.isEmpty("bob")     = false
     * StringUtils.isEmpty("  bob  ") = false
     * </pre>
     *
     * <p>NOTE: This method changed in Lang version 2.0.
     * It no longer trims the CharSequence.
     * That functionality is available in isBlank().</p>
     *
     * @param cs  the CharSequence to check, may be null
     * @return {@code true} if the CharSequence is empty or null
     * @since 3.0 Changed signature from isEmpty(String) to isEmpty(CharSequence)
     */
    public static boolean isEmpty(CharSequence cs) {
        return cs == null || cs.length() == 0;
    }

    /**
     * <p>Checks if a CharSequence 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 cs  the CharSequence to check, may be null
     * @return {@code true} if the CharSequence is null, empty or whitespace
     * @since 2.0
     * @since 3.0 Changed signature from isBlank(String) to isBlank(CharSequence)
     */
    public static boolean isBlank(CharSequence cs) {
        int strLen;
        if (cs == null || (strLen = cs.length()) == 0) {
            return true;
        }
        for (int i = 0; i < strLen; i++) {
            if (Character.isWhitespace(cs.charAt(i)) == false) {
                return false;
            }
        }
        return true;
    }



© 著作权归作者所有

上一篇: 在Vim中设置BOM
下一篇: MQ Reason code list
Hazelnut

Hazelnut

粉丝 1
博文 11
码字总数 1446
作品 0
南京
程序员
私信 提问
zf2的inputfilter

' 使用语句(注,此处重点在于说明数据校验): $inputFilter->add($factory->createInput(array( 'name' => 'content', 'require' => true, 'filters' => array( array('name'=>'StripTags'......

块块
2013/04/01
0
0
PHP 判断变量是否为空

1. isset功能:判断变量是否被初始化 说明:它并不会判断变量是否为空,并且可以用来判断数组中元素是否被定义过 注意:当使用isset来判断数组元素是否被初始化过时,它的效率比arraykeyexi...

ufo00001
2017/07/05
0
0
PHP判断变量为空

====== PHP判断变量为空 ====== ===== isset ===== 功能: 判断变量是否被初始化。 数组中元素是否被定义过。 当使用isset来判断数组元素是否被初始化过时,它的效率比arraykeyexists高4倍左...

一点灵犀
2016/05/26
8
0
项目开发——代码规范

任何数据、对象、变量、URL传参的值、Post传参的值等等,总之,任何要使用的数据对象,都要先进行合法性判断再使用。这里的合法性包括:是否为空,是否是只被允许的类型,是否是Null,是否是...

Raphael_goh
2014/11/24
13
4
PHP中判断变量为空的几种方法

判断变量为空,在许多场合都会用到,同时自己和许多新手一样也经常会犯一些错误, 所以自己整理了一下PHP中一些常用的、判断变量为空的方法。 1. isset功能:判断变量是否被初始化 说明:它并...

雍雍_yoyo
2013/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue-Ueditor

记录,忘了还要写啥了,先发吧,后面再补。。。 代码示例 import UEditor from '@/components/UE.vue';components: { UEditor },return {config: { //可以在此处定义工...

华山猛男
35分钟前
2
0
jupyter部署安装

python373 -m ipykernel install --name python373 ipython kernelspec list sc create myjupyterservice binpath="D:\apply\Python373\Scripts\jupyter-notebook --config=V:/my_work/jupyt......

mbzhong
49分钟前
4
0
聊聊feign的Contract

序 本文主要研究一下feign的Contract Contract feign-core-10.2.3-sources.jar!/feign/Contract.java public interface Contract { /** * Called to parse the methods in the class t......

go4it
今天
3
0
Linux 软链接和硬链接简介

本文主要介绍了Linux系统中的链接文件。 文件系统 在Linux系统中,将文件分为两个部分:用户数据和元数据。 元数据(inode) 元数据即文件的索引节点(inode),用来记录文件的权限(r、w、x...

问题终结者
今天
5
0
RocketMQ的事务投递

RocketMQ的事务投递 这是阿里的分布式事务图: 1、A服务先发送个Half Message给Brock端,消息中携带 B服务 即将要+100元的信息。 2、当A服务知道Half Message发送成功后,那么开始第3步执行本...

春哥大魔王的博客
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部