`

Java 中关于String的空对象(null) ,空值(empty),空格

阅读更多
Tips_self:
if(carService.getFull(assign.getCar().getId()).getKind() != null){
if("机动".equals(carService.getFull(assign.getCar().getId()).getKind().getDisplayName())){
					return true;
				}
}

--当取到getKind()为空时再getDisplayName()==null会一直报空指针,因为前一个对象getKind已经为空了。

Java 中关于String 对象的空对象(null), 空值(""),空格(" ")对于很多人来说很模糊,下面将分别介绍一下他们的用法:定义,判断,运算。

首先,先上代码:


[java]
private void testStringNullOrEmpty() {  
  
        // 如果s=null代表空对象,即还没创建出对象,就是还没开辟空间,。  
        // 如果s = ""表示创建出了对象,但是这个对象内容为空,也就是空字符串。  
        // 如果s = " "表示创建出了对象,但是这个对象内容为不为空,而是空格。  
  
        String s = null;  
        String k = "";  
        String n = " ";  
        String t = "ab";  
  
        Log.d(TAG, "s = " + s);                    //output : s = null  
        Log.d(TAG, "k = " + k);                    //output : k =   
        Log.d(TAG, "t = " + t);                    //output : t = ab  
        Log.d(TAG, "n = " + n);                    //output : n =   
        Log.d(TAG, "t.length() = " + t.length());  //output : t.length() = 2  
        Log.d(TAG, "k.length() = " + k.length());  //output : k.length() = 0  
        Log.d(TAG, "n.length() = " + n.length());  //output : n.length() = 1  
  
        //equals方法比较的是两个对象的内容是否相同,因此,对象必须有指向的空间,即不能为null,否则,会抛出异常。  
        Log.d(TAG, "k.equals(null) = " + k.equals(null));  //output : k.equals(null) = false  
        Log.d(TAG, "k.equals(\"\") = " + k.equals(""));     //output : k.equals("") = true  
        Log.d(TAG, "k.equals(\" \") = " + k.equals(" "));   //output : k.equals(" ") = false  
        Log.d(TAG, "n.equals(\"\") = " + n.equals(""));     //output : n.equals("") = false  
        Log.d(TAG, "n.equals(\" \") = " + n.equals(" "));   //output : n.equals(" ") = true  
        // Log.d(TAG, "s.equals(null) = " + s.equals(null)); //异常  
        Log.d(TAG, "k.isEmpty() = " + k.isEmpty());         //output : k.isEmpty() = true  
        Log.d(TAG, "n.isEmpty() = " + n.isEmpty());         //output : n.isEmpty() = false  
        // Log.d(TAG, "s.isEmpty() = " + s.isEmpty());      //异常  
  
        Log.d(TAG, "s == null = " + (s == null));          //output : s == null = true  
  
        // 在使用"+"操作符时,如果有一个操作数是字符串,其他操作数会被转换成字符串  
        s = s + t;  
        Log.d(TAG, "after (s + t) s = " + s);                //output : after (s + t) s = nullab  
        Log.d(TAG, "s.length() = " + s.length());            //output : s.length() = 6  
        Log.d(TAG, "s == null = " + (s == null));           //output : s == null = false  
  
    }  


定义

空对象:
String s = null;

空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例化该对象,因此,空对象在调用所有对象方法时候都会抛出异常,如s.length(), s.isEmpty()等方法。

空值:
String k = "";

空值是指一个字符床对象已经实例化,即系统已经给该变量分配了空间,只是对象的内容为空。

空格:
String n = " ";

是指一个字符对象已经实例化,对象的内容为空格。



判断
对于上述三种情况,如何判断一个字符变量属于上述类型,下面主要介绍下方法:

空对象判断:
判断一个字符变量是否是null ,使用 逻辑判断 等于(==)与null对象比较,代码表达式如下:

s == null;

注意: 空对象不能使用诸如equals(), isEmpty()等对象方法,因为它未被实例化。

空值判断:

判断空值可有三种方式:
    (1)equals方法比较的是两个对象的内容是否相同,可用表达语句:k.equals("") ;
      (2)  length()方法是查看某个字符串对象的字符个数,可用表达式判断:k.length() == 0 ;

      (3)  isEmpty()方法是判断某个字符串对象字符个数时候为0,可用表达式判断:k.isEmpty() ;



空格判断:
空格内容为一个空格,虽然在输出显示时候和空值一样,都是空的,但是在系统里面的内存机制不一样的,空格字符串表示该对象的内存空间里面有内容,是空格,字符个数是1,因此,在使用如下方法时候结果如下:

n.length() 的输出值为1, n.isEmpty()输出为false。

判断语句: n.equals(" ") ;



运算
字符串提供了"+"操作符,表示两个字符串对象可以链接一起,在使用该运算时候,有这样一条规则:如果有一个操作数是字符串,其他操作数会被转换成字符串。



在上面代码s = s + t; s申明时候为空对象,通过"+"时,会将null转化为一个字符串对象。因此结果是nullab。



大家可以对照上面代码例子,更加详细的了解这三者实现机制。

补充:

对象是否为空过滤空行为空不为空StringUtil
java 中如何判断一个未知对象是否为空呢?
下面是一个通用的方法,判断字符串是否为空,集合是否为空,数组是否为空:

/** 
     * 判断对象或对象数组中每一个对象是否为空: 对象为null,字符序列长度为0,集合类、Map为empty 
     *  
     * @param obj 
     * @return 
     */  
    public static boolean isNullOrEmpty(Object obj) {  
        if (obj == null)  
            return true;  
  
        if (obj instanceof CharSequence)  
            return ((CharSequence) obj).length() == 0;  
  
        if (obj instanceof Collection)  
            return ((Collection) obj).isEmpty();  
  
        if (obj instanceof Map)  
            return ((Map) obj).isEmpty();  
  
        if (obj instanceof Object[]) {  
            Object[] object = (Object[]) obj;  
            if (object.length == 0) {  
                return true;  
            }  
            boolean empty = true;  
            for (int i = 0; i < object.length; i++) {  
                if (!isNullOrEmpty(object[i])) {  
                    empty = false;  
                    break;  
                }  
            }  
            return empty;  
        }  
        return false;  
    }  

参考:org.apache.commons.lang.StringUtils

应用场景:
读取excel文件,转化为一个二维数组:Object[][] arrays
但是excel中有空行,所以需要过滤Object[][] arrays中的空的一维数组:
/*** 
     * 过滤数组中的空元素 
     *  
     *  
     * @param arrays 
     * @return 
     */  
    public static Object[][] filterEmpty(Object[][] arrays) {  
        int sumNotNull = 0;  
        /*** 
         * 统计非空元素的总个数 
         */  
        for (int i = 0; i < arrays.length; i++) {  
            Object object = arrays[i];  
            if (!ValueWidget.isNullOrEmpty(object)  
                    && !SystemUtil.isNullOrEmpty((Object[]) object)) {// 判断元素是否为空  
                sumNotNull = sumNotNull + 1;  
            }  
        }  
        Object[][] filtedObjs = new Object[sumNotNull][];  
        int index = 0;  
        for (int i = 0; i < arrays.length; i++) {  
            Object[] object_tmp = arrays[i];  
            if (!ValueWidget.isNullOrEmpty(object_tmp)  
                    && !SystemUtil.isNullOrEmpty((Object[]) object_tmp)) {// 判断元素是否为空  
                filtedObjs[index++] = object_tmp;  
            }  
        }  
        return filtedObjs;  
    } 

参阅附件中的方法com.common.util.SystemUtil.filterEmpty
分享到:
评论

相关推荐

    判断字符串是否是空

    1. **空字符串(Empty String)**: 字符串长度为0,即没有包含任何字符。 2. **空格字符串(Whitespace String)**: 虽然字符串长度不为0,但只包含空格、制表符等空白字符。 3. **NULL或nil字符串**: 字符串对象...

    @NotEmpty、@NotBlank、@NotNull的区别

    在Java编程语言中,校验框架如Hibernate Validator提供了多种注解来确保数据的正确性,其中`@NotEmpty`、`@NotBlank`和`@NotNull`是三个常用的注解,它们各自有不同的用途和适用场景。 1. **@NotEmpty** `@Not...

    解决IOS开发空字符串的方法

    2. **`NULL`**:这是C语言中的空指针,通常用于非对象类型。 3. **`[NSNull null]`**:这是一个特殊类,用来表示集合类(如数组、字典)中的“空”值,因为集合类不允许存储`nil`。 针对这些情况,我们需要编写一个...

    Springboot集成JSR303参数校验的方法实现

    Spring Boot集成JSR303参数校验的方法实现涉及了Java中参数校验的标准规范,即JSR303(Bean Validation)规范,该规范通过在Java对象属性上添加注解来实现数据校验的约束定义。这种方式能够将校验逻辑与业务逻辑分离...

    2021-2022计算机二级等级考试试题及答案No.10325.docx

    - D选项:SPACE(n)返回n个空格组成的字符串,因此SPACE(2)返回两个空格,EMPTY(SPACE(2))判断两个空格是否为空,结果为假。 ### 10. Java 中的字符串比较 **题目描述:** 关于以下程序段,正确的说法是() 1. ...

    正则表达式

    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp...

    JavaScript中的Truthy和Falsy介绍

    3. `null` - null是一种特殊的数据类型,表示一个空值或无对象状态。 4. `0` - 包括正零和负零,它们在逻辑上被视为假。 5. `NaN` - Not-a-Number,表示非数字值。 6. `""` - 空字符串,即不包含任何字符的字符串。 ...

    vb常用函数

    - **空字符串** (`Empty`):转换为空字符串 `""`。 - **错误值**:包含英文单词 "Error" 以及错误代码的字符串。 - **其他数值类型**:转换为该数值的字符串形式。 #### 四、类型转换类函数 **功能介绍**:类型...

    VBA程序设计基础教程

    - **特殊类型**: Object、Error、Empty、Null **1.4 变量与常量** - **变量**: 存储数据的容器。 - **常量**: 其值在程序运行过程中不会改变。 - **声明**: 使用`Dim`、`Public`、`Private`关键字声明变量或常量。 ...

    VBS函数集合

    42. **Err对象**:保存关于运行时错误的信息。 43. **Eval函数**:计算并返回字符串表达式的值。 44. **Execute方法**:根据提供的字符串执行正则表达式匹配。 45. **Execute语句**:执行单个或多个指定的语句。 ...

Global site tag (gtag.js) - Google Analytics