`
jiiming
  • 浏览: 7211 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java开发的一些小经验一(判断字符串是否为空)

阅读更多
        在做Java开发的过程中,经常会有一些这样或那样的错误,这些错误在一些或深入浅出、或入门的书里面都有提到过,但是这就像是生活中的一些教训,说多少遍都是白扯,只有自己经历了,才会懂。
        但是还是要写下来,一来作为自己的一个总结、反思,二来给不幸看到这篇小博客的同学们一点启发,哪怕在某天写代码的过程中有一瞬间想起来,并在自己的代码中使用这些小的技巧。虽然不能让程序一下子健壮起来,更不可能一下子让写代码的人高达上,但是至少会减少中午午睡的时候被叫醒去解决问题的次数。
        文章十分的浅显,高手、大拿可以直接掠过。
        今天就聊聊判断一个字符串是否为空
        经常在程序里面需要判断某一个字符串是否是空的,尤其是用在判断方法的参数是否为空,比如:
/*
* foo 
* version 1
	*/
public boolean foo(String param){
	//经常用这种方法来判断对象是不是空
	if(param == null || param.equals("")){
		//Some Code
	}
	//Do someting
}

        如果一眼就看出上面代码的问题,说明你的代码已经敲了不少,有可能是吃过空指针的亏,有可能是聪明人一学就会这两种情况都不错,因为后面就不会再因为这样的代码而吃亏了。
        下面就想想办法,看看怎么来优化一下。
        由于foo这个方法中,if语句是用的或关系,这样的话,由于有个短路判断的存在,当param是null的时候,就不会再执行后面的equals方法了,这样的话可以在一定程度上掩盖这种写法的问题。
        但是,当上面的或关系变成且的关系,会出现什么情况呢?回报空指针异常!
这是因为当判断了param==null后,再判断param.equal(""),这时,由于param指向的是null,所以会抛出异常来。
        那么把代码改下把,把foo方法变成下面这样:
/*
* foo 
* version 2
	*/
public boolean foo(String param){
	//经常用这种方法来判断对象是不是空
	if(param == null && "".equals(param)){
		//Some Code
	}
	//Do someting
}

        这样的话,不论param是否为空,都不会出现异常了。
        如果事情就这样结束了该多好,但是回头再看foo的第二版时,发现还是有点儿不大对头,万一哪天我把param==null这半句,少写一个等号,会出现什么呢?先赋值,然后再判断,抛出空指针,太幸运了,在开发阶段就能发现隐含的BUG。
        但是假设把if语句变成下面的形式呢:
       
if("".equals(param) && param = null)

        这时,条件判断是为真的,但是好不容易判断了个非空字符串,没相当又在自己的手里变成空的了!
        那么继续优化一下foo吧
/*
* foo
* version 3
	*/
public boolean foo(String param){
	//经常用这种方法来判断对象是不是空
	if(null == param && "".equals(param)){
		//Some Code
	}
	//Do someting
}

        第三版的foo和第二版相比,只是把null和param换了下位置。再来分析一下发现,如果少打一个等号,编译都不会通过了!这就杜绝了我们在判断一个对象的时候无意间修改这个对象。
        上面说的这些不只是限于Java有这种问题,在C、C++以及其他语言中都可能会有这样的问题,但是思路都是一样的,这有点类似于写作文,不论是小学生还是初中生,或者是高中生,以及各种作家,在写记叙文时,都免不了六要素: 人物、时间、地点、事件的起因、经过和结果。
3
9
分享到:
评论
25 楼 jiiming 2014-04-02  
white_crucifix 写道
好吧,其实楼主谈的更多的是一种思考方式,而不是这个方法具体应该写成什么样。

是的,这里不是想要说明我的这个判断方法如何,只是给大家提供一个思路。
我是不是有点篮球教练投篮没有投进去说:“看到了吧,这样投篮肯定是进不去”的意思
24 楼 StrongZhu 2014-04-02  
EXvision 写道
StringUtils.isBlank(String param)

StringUtils.isNotBlank(String param)

请看apache commons的lang组件

恩,一句话的事
23 楼 mfkvfn 2014-04-02  
代码1本来没有问题,可以正常工作。只是写法上不怎么好。
你最后那代码永远返回false。

最好的写法应该是
if(null==param || param.isEmpty())
或者
if(null==param || param.length()==0)
22 楼 white_crucifix 2014-04-02  
好吧,其实楼主谈的更多的是一种思考方式,而不是这个方法具体应该写成什么样。
21 楼 yixiandave 2014-04-02  
我信奉拿来主义,Commons-lang里面已经有现成的了
StringUtils.isEmpty(str);//源码:str==null||str.length()==0
StringUtils.isBlank(str);//在isEmpty基础上增加了空格符号的识别,也就是
//StringUtils.isBlank("  ")==true,可以识别全角空格符
//对应的还有isNotEmpty和isNotBlank

20 楼 肖泽文 2014-04-02  
表示没看懂,坚持第一个的判断!
  短路或是最好的,只是是null就返回true,后面的equals就不会判断了,多省事!
19 楼 sheep3600 2014-04-02  
jiiming 写道
sheep3600 写道
public static boolean foo(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;
}

好多事情真的好久远了,借用一下吧。


呵呵,用这个吧,一劳永逸,判断String杠杠滴。
18 楼 zhang_xzhi_xjtu 2014-04-02  
cucaracha 写道
zhang_xzhi_xjtu 写道
另外 @楼主
你的3个版本本地跑个测试吧,问题你就明白了。

不好意思,之前写太快写错了,正确的应该是这样:
public boolean foo(String param){  
    return null != param && !"".equals(param.trim());     
}   


中间是与的关系,param 不能为空并且也不能为空字符串。如果是 null,那么 && 符号前面部分就会返回 false,不会再执行后面部分,因此不会有 NPE。




(不考虑trim)
原来是判断String是否为空,现在变成了判断是否为非空。
有点意思。
其实现在的实现就是第一版实现的取反了,然后应用一下德·摩根定律。

个人还是更喜欢这种实现方式,一眼就知道是对的。不费大脑。
    public static boolean isEmptyString(String param) {
        return param == null || param.length() == 0;
    }

    public static boolean isNotEmptyString(String param) {
        return !isEmptyString(param);
    }
17 楼 cucaracha 2014-04-01  
zhang_xzhi_xjtu 写道
另外 @楼主
你的3个版本本地跑个测试吧,问题你就明白了。

不好意思,之前写太快写错了,正确的应该是这样:
public boolean foo(String param){  
    return null != param && !"".equals(param.trim());     
}   


中间是与的关系,param 不能为空并且也不能为空字符串。如果是 null,那么 && 符号前面部分就会返回 false,不会再执行后面部分,因此不会有 NPE。
16 楼 zhang_xzhi_xjtu 2014-04-01  
另外 @楼主
你的3个版本本地跑个测试吧,问题你就明白了。
15 楼 zhang_xzhi_xjtu 2014-04-01  
cucaracha 写道
if(null == param && "".equals(param)) 真的是这样吗? param 同时为空和为空字符串才能进 if 语句,看来还真为难 param。

正确写法应该是这样:

public boolean foo(String param){
    return null != param || !"".equals(param.trim());   
}  



if(null == param && "".equals(param)) 真的是这样吗? param 同时为空和为空字符串才能进 if 语句,看来还真为难 param。
这个是在为难param吗?

null != param || !"".equals(param.trim());
你param为null怎么办?不NPE吗?

null != param || !"".equals(param));
不考虑trim的时候。
这个你能找个param让它返回false吗?
你和楼主一起为难param吗?
14 楼 cucaracha 2014-04-01  
if(null == param && "".equals(param)) 真的是这样吗? param 同时为空和为空字符串才能进 if 语句,看来还真为难 param。

正确写法应该是这样:

public boolean foo(String param){
    return null != param || !"".equals(param.trim());   
}  
13 楼 bitray 2014-04-01  
不trim.这个基本的判断都不好用阿.哪怕判断一个length呢
12 楼 EXvision 2014-04-01  
StringUtils.isBlank(String param)

StringUtils.isNotBlank(String param)

请看apache commons的lang组件
11 楼 niedj 2014-04-01  
jiiming 写道
liuwei_java 写道
判断字符串是否为空应该是用“或”吧,用“并且”的话永远也不会执行if里面的语句吧。

对滴,是这么回事儿,但是这种写法的确是会抛出异常

小弟不才,想问一下,如果我传入的是null或者"",这两个貌似都进不到if代码段里面啊。
10 楼 jiiming 2014-04-01  
zqb666kkk 写道
/*
* foo
* version 3
    */ 
public boolean foo(String param){ 
    //经常用这种方法来判断对象是不是空 
    if(null == param && "".equals(param)){ 
        //Some Code 
    } 
    //Do someting 
}

你这样写的不对吧 如果 param==null
if根本不会进去
然后下面就报异常了
public static String stringIsNull(Object objstr) {
		if (null == objstr) {
			return "";
		} else {
			return objstr.toString();
		}
	}

if(!stringIsNull(param).equals("")){  //如果不等于空
   //do something
}


对头,这里只是为了举例说明在使用String的equals方法时,如果没有判断String是否为null,会抛出异常
9 楼 jiiming 2014-04-01  
liuwei_java 写道
判断字符串是否为空应该是用“或”吧,用“并且”的话永远也不会执行if里面的语句吧。

对滴,是这么回事儿,但是这种写法的确是会抛出异常
8 楼 jiiming 2014-04-01  
mistbow 写道
apache commons库

StringUtils.isEmpty(String param)

一直都用这个 没自己写过

这种代码一般都会做些封装,哪个系统不封装一些这样的方法呢
7 楼 jiiming 2014-04-01  
sheep3600 写道
public static boolean foo(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;
}

好多事情真的好久远了,借用一下吧。

6 楼 jiiming 2014-04-01  
fanjf2012 写道
哥哥啊,你真是新手啊,刚毕业吧,字符串判空你不trim?

呵呵,你说的有道理,这个我也是知道,只是这儿讨论的是判断一个字符串是不是空的," "(双引号中间有一个空格)这种情况没有放在讨论的范围内而已。

相关推荐

    【JS】Java 判断字符串是否为空的三种方法

    ### Java 判断字符串是否为空的三种方法 在Java编程中,经常需要判断字符串是否为空(null 或者空字符串)。为了确保程序的健壮性和避免NullPointerException等异常,掌握正确的字符串判断方法至关重要。本文将详细...

    JAVA判断字符串是否为数字字符

    ### JAVA判断字符串是否为数字字符 在日常的Java开发工作中,我们经常需要验证用户输入的数据是否符合预期格式,比如验证电话号码、身份证号等是否仅包含数字。这种情况下,一个简单有效的工具方法就显得尤为重要了...

    判断字符串格式的时间

    其中,`IsMatch` 方法用于判断指定的字符串是否与正则表达式匹配。 #### 2. IsMatch 方法详解 在提供的代码示例中,使用了 `IsMatch` 方法来进行字符串格式验证。具体代码如下: ```csharp public int IsDate...

    Java判断字符串是否为IP地址的方法

    Java判断字符串是否为IP地址的方法 Java判断字符串是否为IP地址的方法是指通过编写特定的方法来判断输入的字符串是否符合IP地址的格式。这种方法在实际开发中非常有用,特别是在网络编程和网络安全等领域。 在Java...

    java判断一个字符串是否是小数的方法

    在上面的代码中,我们首先使用 StringUtils.isBlank() 方法来判断字符串是否为空或长度为 0 或由空白符构成。如果字符串为空或长度为 0 或由空白符构成,返回 false。否则,我们使用 matches() 方法来判断字符串是否...

    java 字符串操作类

    3. **判断字符串是否为空**: `isEmpty()` 和 `isNotBlank()` 是两个重要的判断方法。`isEmpty()` 通常用于检查字符串是否为 null 或长度为 0,而 `isNotBlank()` 不仅检查空和长度,还会考虑字符串中是否有空白...

    Java中String判断值为null或空及地址是否相等的问题

    接下来,我们来看一个简单的例子,展示了如何正确地检查字符串是否为`null`或空值: ```java public class Test { public static void main(String[] args) { String value = null; testNullOrEmpty(value); ...

    java中常用字符串方法总结

    `isEmpty()`方法判断字符串是否为空。 16. **复制字符串** `repeat(int count)`方法在Java 11中引入,用于重复字符串`count`次。 17. **字符串编码与解码** `getBytes()`将字符串转换为字节数组,`new String...

    OJ_判断字符串类型

    在编程领域,尤其是在线判题系统(Online Judge,简称OJ)中,判断字符串类型是一项常见的任务。这个题目“OJ_判断字符串类型”可能是要求编写一个程序,用于分析输入的字符串并确定其特定的类型,如数字、字母、...

    判断字符串是否有小数的特征,并且能否转换成小数

    4. **性能优化**:使用 `String#matches` 方法结合正则表达式可以更高效地判断字符串是否符合数字格式。 ### 三、改进后的实现方案 #### 3.1 公共方法抽象 首先,我们可以定义一个公共方法 `isEmptyOrWhitespace` ...

    Java如何优雅地判断对象是否为空

    总之,优雅地判断对象是否为空是Java开发中的重要技能。合理地使用`Objects`类、第三方库以及正确的集合和字符串处理方法,能够提高代码质量,减少运行时错误,从而提高程序的稳定性和用户体验。在编写代码时,务必...

    Java编写的非常有用的方法,文字中提取中文字符

    本文将深入探讨两个关键知识点:如何从字符串中提取所有中文字符以及如何判断一个字符串是否为空白字符串。 首先,让我们关注“提取汉字”这个主题。在Java中,我们可以使用正则表达式和循环遍历的方式来实现这个...

    Java字符串常用方法

    - **判断字符串是否为空(null或长度为0)**:同样使用`isNullOrEmpty()`方法。 - **截取字符串从开始到给定长度的一段**:使用`substring(int beginIndex, int endIndex)`方法。 - **判断字符串是否以某个前缀开头*...

    理解java中的字符串的内存分配

    比较这两个变量时,应该使用 `if (str1 == null)` 来判断 `str1` 是否为 `null`,而使用 `if (str2.equals(""))` 来判断 `str2` 是否为空字符串。 #### 变量字符串与常量字符串的区别 考虑以下代码: ```java ...

    Java中常用字符串方法总结.doc

    ` 方法可以判断字符串的一个子字符串与参数 other 的一个子字符串是否相同。 查找字符串中某个位置的字符 String 类提供了 `charAt()` 方法,可以返回指定索引位置上的字符。例如,`public char charAt(int index)...

    android、Java下判断两个String是否相等 、EditText输入是否为空,限定输入数字的实现

    以下是一个综合示例,展示如何判断 EditText 输入是否为空,并提示用户输入不能为空: ```java EditText et = (EditText) findViewById(R.id.edit_text); if ("".equals(et.getText().toString().trim())) { new ...

    Java实训教程 Java软件开发实战 Java类库 第2章 字符串处理 共49页.pptx

    注意:`isEmpty()`方法只判断字符串是否为空字符串,并不会判断是否为`null`。 #### 三、`StringBuffer`与`StringBuilder`类 `StringBuffer`和`StringBuilder`类提供了一种可变的字符串解决方案。这两个类都继承自...

    java代码-判断字符串中是否有另一个字符串

    在你提供的`main.java`文件中,可能包含了使用以上方法之一来判断字符串中是否有另一个字符串的示例代码。`README.txt`文件可能包含了关于这个代码的说明和使用指导。如果你需要具体的代码实现或者更深入的解释,...

    java 字符串线输出大写后输出小写

    ### Java字符串操作:按字符大小写分类输出 在Java编程语言中,字符串处理是一项非常重要的技能,尤其是在数据清洗、文本分析等应用场景下。本篇文章将详细介绍如何实现一个简单的程序,该程序可以接收一个字符串...

    Java判断对象是否为空(包括null ,"")的方法

    这篇文章将深入探讨如何在Java中检查对象是否为`null`或空字符串,并提供一个实用的工具类示例,帮助开发者实现这一功能。 首先,我们来看如何判断一个对象是否为`null`。在Java中,你可以直接使用`==`运算符与`...

Global site tag (gtag.js) - Google Analytics