代码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包及帮助
分享到:
相关推荐
解决方法:异步操作的问题。云函数主体代码运行到最尾时就会结束线程,不会等你异步的返回结果。 // 云函数的index.js文件中 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() ...
解决这个问题的方法是将数字转换为字符串,确保它们被包围在单引号中,以确保它们被视为字符串传递,如下所示: ```javascript + numArr[i].toString() + "','n_" + i + "');\" class='buy'" ``` 这样做后,`...
在处理网站后端逻辑时,经常会遇到各种各样的错误,其中一种...通过对这个错误的分析和解决过程,我们可以学到在处理数据库和编写脚本时,对于空值和NULL的正确处理方法,以及如何利用SQL函数来简化和优化问题的解决。
### C常见错误及解决方案 #### 1. 把“=”误当作“==”使用 **错误举例** ```c if (rect.top = rect.bottom) { MessageBox(hwnd, "Invalid rectangle!", NULL, MB_OK | MB_ICONERROR); } ``` **解决方案** 这种...
Delphi 中提示尚未调用 CoInitialize 错误的解决方法 COM(Component Object Model)是微软公司开发的一种软件组件模型,用于实现跨语言、跨平台的软件组件之间的交互。OLE(Object Linking and Embedding)是微软...
Delphi 中解决 "未调用 CoInitialize" 错误的方法 在 Delphi 开发中,遇到 "尚未调用 CoInitialize" 错误是一种常见的问题。这个错误通常发生在使用 COM 组件或 OLE 对象时,例如使用 ADO 数据库组件或 WebBrowser ...
### 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...
首先,我们要理解 `NULL` 和空字符串的区别。`NULL` 在SQL中表示“未知”或“无值”,而空字符串则是一个零长度的字符串,它是一个具体的值。在进行比较时,`NULL` 不等于任何其他值,包括 `NULL` 本身,而空字符串...
解决这个问题的方法是在DLL的初始化部分调用CoInitialize,并在最终化部分调用CoUninitialize。例如: ```delphi initialization CoInitialize(nil); finalization CoUninitialize; end. ``` 对于封装了...
然而,如果你发现这种方法没有返回任何结果,那么可能是因为字段的值并不是真正的NULL,而是空字符串或者未定义的值。 在上述情况中,直接使用“is null”条件无法匹配到包含空字符串或未定义值的字段。此时,我们...
这些问题若不加以解决,会对系统的稳定性造成重大威胁,因此,深入理解它们的区别和解决方案是保障系统高可用性的关键所在。 缓存穿透指的是用户查询的数据既不在缓存中,也不存在于数据库中,此时恶意请求可以绕过...
- **解决方法**:推荐使用统一的方法获取坐标值,例如可以定义一个函数`getEventXY(event)`,在其中根据浏览器类型选择合适的坐标属性。 #### 四、window.location.href问题 - **问题描述**:不同版本的Firefox...
解决方法:要弄清楚逻辑运算符和按位运算符的区别,其次看清楚题目的要求,如有必要可以先将两种运算符写下来,先进行区分,然后再编程。 1.3加“()”和不加“()”的区别 在C语言中,括号“()”的优先级是最高的,...
不过,`HashMap` 的同步问题可以通过 `Collections.synchronizedMap()` 方法得到解决,该方法可以将 `HashMap` 包装成一个线程安全的 `Map` 实例。 #### 三、null 值处理 - **HashMap**:允许使用 `null` 键和 `...
为了解决这些问题,`DetachedCriteria` 应运而生。它允许在Web层构造查询条件,并将其作为参数传递给业务层对象,从而实现查询语句构造的完全解耦。这样,业务层仅需关注数据的持久化和查询封装,而不必关心具体的...
7. **字符串操作**:JavaScript提供了丰富的字符串方法,如substring、trim、split、replace等,对字符串的处理能力直接影响到问题的解决方案。 8. **正则表达式**:正则表达式用于文本匹配和操作,对于处理复杂的...
答案:HashMap使用链表来解决哈希冲突的问题。 3. 什么是HashMap的加载因子? 答案:HashMap的加载因子是指HashMap中键值对的数量与数组长度的比率。当加载因子超过阈值时,HashMap会自动扩容。 HashMap和HashTable...
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内存溢出分为以下几种类型: - ...