`

null ""的区别及解决方法

阅读更多

代码review的时候居然发现犯这么低级的错误,判空方法严重错误

 

 

String strNull = null; str引用为空,对象还未创建 
String strEmpty = ""; str应用一个空串,栈空间中已经分配内存空间 
   
    
//先判断是不是对象,如果是,再判断是不是空字符串
if(strNull == null || strEmpty.equals(" ")){
    // do something
}


//我们这里是声明的strEmpty,如果我们不知道strEmpty是否已经声明呢
//所以,很有可能strEmpty没有创建,那么Nullpointer Exception就发生了
//因此,我们要用一个已知的变量去equals一个未知的变量
if(strNull == null || "".equals(strEmpty)){
    // do something
}

//但是更好的方法是我们用apache的第三方jar包
//apache commons 有一个StringUtils里面包含了判空方法,其源代码如下

public static boolean isEmpty(String str) {
     return str == null || str.length() == 0;
}


//isEmpty(String str) 我们同时注意到如果str为Null 同样有空指针错误

//好在ObjectUtil里面重写了toString方法,我们查看其源代码如下
public static String toString(Object obj) {
     return obj == null ? "" : obj.toString();
}

  
//所以,如果怕导致空指针异常我们只需要先调用toString方法
//然后调用isEmpty方法即可,例子如下
package com.test;
import org.apache.commons.lang.StringUtils;
/**
 *
 * @author kevin.yang
 */
public class StringUtilsTest {
    public static void main(String[] args){
        StringUtilsTest testNull = null;
        StringUtilsTest test = new StringUtilsTest();
        boolean isNull ;
        
        //对象不为空
      isNull = StringUtils.isEmpty(test.toString());
        System.out.println("对象不为空||test.toString():"+test.toString());

        //对象为空
     isNull = StringUtils.isEmpty(testNull.toString());
        System.out.println("对象为空||testNull.toString()"+testNull.toString());
    }
}
//我们可以看到控制台报空指针了
对象不为空||test.toString():com.test.StringUtilsTest@de6ced
Exception in thread "main" java.lang.NullPointerException
        at com.test.StringUtilsTest.main(StringUtilsTest.java:18)
Java Result: 1

//原因在与testNull 对象为空,其调用jdk的toString()方法必然报错
//一方面我们可以自己重写toString方法,我采用的是
//调用lang包下的ObjectUtils下的toString方法
package com.test;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.ObjectUtils;
/**
 *
 * @author kevin.yang
 */
public class StringUtilsTest {
    public static void main(String[] args){
        StringUtilsTest testNull = null;
        StringUtilsTest test = new StringUtilsTest();
        boolean isNull ;
        
        //对象不为空
        isNull = StringUtils.isEmpty(test.toString());
        System.out.println("对象不为空||test.toString():"+test.toString());

        //对象为空
        //isNull = StringUtils.isEmpty(testNull.toString());
        //System.out.println("对象为空||testNull.toString()"+testNull.toString());

        //调用ObjectUtils下的方法
        String obNull = ObjectUtils.toString(testNull);
        System.out.print("obNull:"+obNull);

        System.out.println("obNull--->isEmpty():"+StringUtils.isEmpty(obNull));
    }
}

//我们看看控制台的输出
对象不为空||test.toString():com.test.StringUtilsTest@de6ced
obNull:obNull--->isEmpty():true
    这样我们就解决了为空的问题
    commons包下还有很多很好用的工具,可以到网上下载他的jar包及帮助
分享到:
评论

相关推荐

    【小程序云开发】本地调试和云端测试的结果不一致,返回值result为null

    解决方法:异步操作的问题。云函数主体代码运行到最尾时就会结束线程,不会等你异步的返回结果。 // 云函数的index.js文件中 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() ...

    js获取对象为null的解决方法

    解决这个问题的方法是将数字转换为字符串,确保它们被包围在单引号中,以确保它们被视为字符串传递,如下所示: ```javascript + numArr[i].toString() + "','n_" + i + "');\" class='buy'" ``` 这样做后,`...

    downplus中的无效使用 Null: ‘replace’错误的解决方法

    在处理网站后端逻辑时,经常会遇到各种各样的错误,其中一种...通过对这个错误的分析和解决过程,我们可以学到在处理数据库和编写脚本时,对于空值和NULL的正确处理方法,以及如何利用SQL函数来简化和优化问题的解决。

    c常见错误及解决方案

    ### C常见错误及解决方案 #### 1. 把“=”误当作“==”使用 **错误举例** ```c if (rect.top = rect.bottom) { MessageBox(hwnd, "Invalid rectangle!", NULL, MB_OK | MB_ICONERROR); } ``` **解决方案** 这种...

    delphi中提示尚未调用coinitialize错误的解决方法.pdf

    Delphi 中提示尚未调用 CoInitialize 错误的解决方法 COM(Component Object Model)是微软公司开发的一种软件组件模型,用于实现跨语言、跨平台的软件组件之间的交互。OLE(Object Linking and Embedding)是微软...

    delphi中提示“尚未调用coinitialize错误”的解决方法.docx

    Delphi 中解决 "未调用 CoInitialize" 错误的方法 在 Delphi 开发中,遇到 "尚未调用 CoInitialize" 错误是一种常见的问题。这个错误通常发生在使用 COM 组件或 OLE 对象时,例如使用 ADO 数据库组件或 WebBrowser ...

    C语言常见问题及规避和解决办法

    ### C语言常见问题及规避和解决办法 #### 1. 声明和初始化 **1.1 如何决定使用哪种整数类型?** 在C语言中,选择正确的整数类型非常重要,因为不同的类型有不同的存储空间和范围。例如,`short int`、`int` 和 `...

    做尚医通项目遇到的问题及相关问题笔记

    解决方法是,创建一个临时表,使用以下语句:CREATE TABLE temp( id INT(11) PRIMARY KEY AUTO_INCREMENT, name VARCHAR(10), created_at timestamp NULL DEFAULT '0000-00-00 00:00:00', updated_at timestamp NULL...

    mysql 中存在null和空时创建唯一索引的方法

    首先,我们要理解 `NULL` 和空字符串的区别。`NULL` 在SQL中表示“未知”或“无值”,而空字符串则是一个零长度的字符串,它是一个具体的值。在进行比较时,`NULL` 不等于任何其他值,包括 `NULL` 本身,而空字符串...

    delphi中提示“尚未调用coinitialize错误”的解决方法.pdf

    解决这个问题的方法是在DLL的初始化部分调用CoInitialize,并在最终化部分调用CoUninitialize。例如: ```delphi initialization CoInitialize(nil); finalization CoUninitialize; end. ``` 对于封装了...

    如何用phpMyadmin查询某表中的某字段为空的数据.pdf

    然而,如果你发现这种方法没有返回任何结果,那么可能是因为字段的值并不是真正的NULL,而是空字符串或者未定义的值。 在上述情况中,直接使用“is null”条件无法匹配到包含空字符串或未定义值的字段。此时,我们...

    缓存穿透、缓存击穿、缓存雪崩区别和解决方案1

    这些问题若不加以解决,会对系统的稳定性造成重大威胁,因此,深入理解它们的区别和解决方案是保障系统高可用性的关键所在。 缓存穿透指的是用户查询的数据既不在缓存中,也不存在于数据库中,此时恶意请求可以绕过...

    浏览器兼容性问题

    - **解决方法**:推荐使用统一的方法获取坐标值,例如可以定义一个函数`getEventXY(event)`,在其中根据浏览器类型选择合适的坐标属性。 #### 四、window.location.href问题 - **问题描述**:不同版本的Firefox...

    C语言中程序陷阱的分析与防范.pdf

    解决方法:要弄清楚逻辑运算符和按位运算符的区别,其次看清楚题目的要求,如有必要可以先将两种运算符写下来,先进行区分,然后再编程。 1.3加“()”和不加“()”的区别 在C语言中,括号“()”的优先级是最高的,...

    Hashtable和HashMap的区别:

    不过,`HashMap` 的同步问题可以通过 `Collections.synchronizedMap()` 方法得到解决,该方法可以将 `HashMap` 包装成一个线程安全的 `Map` 实例。 #### 三、null 值处理 - **HashMap**:允许使用 `null` 键和 `...

    DetachedCriteria Criteria 使用方法

    为了解决这些问题,`DetachedCriteria` 应运而生。它允许在Web层构造查询条件,并将其作为参数传递给业务层对象,从而实现查询语句构造的完全解耦。这样,业务层仅需关注数据的持久化和查询封装,而不必关心具体的...

    Javascript解决方案的问题在LeetCode.zip

    7. **字符串操作**:JavaScript提供了丰富的字符串方法,如substring、trim、split、replace等,对字符串的处理能力直接影响到问题的解决方案。 8. **正则表达式**:正则表达式用于文本匹配和操作,对于处理复杂的...

    HashMap和HashTable底层原理以及常见面试题

    答案:HashMap使用链表来解决哈希冲突的问题。 3. 什么是HashMap的加载因子? 答案:HashMap的加载因子是指HashMap中键值对的数量与数组长度的比率。当加载因子超过阈值时,HashMap会自动扩容。 HashMap和HashTable...

    拉链表重复跑数据错误解决.docx

    if(ui.id is not null and uh.end_date='9999-99-99' and uh.start_date !='2020-06-15',date_add(ui.dt,-1), uh.end_date) end_date from dwd_dim_user_info_his uh left join ( select * from ods_user_info...

    内存溢出解决

    - **本地方法栈**:与虚拟机栈的作用非常相似,区别在于虚拟机栈执行Java方法,而本地方法栈则执行Native方法。 ##### 2. **分析内存溢出类型** 根据内存溢出的位置不同,可以将Java内存溢出分为以下几种类型: - ...

Global site tag (gtag.js) - Google Analytics