Java 中空指针处理方法
空指针异常(Null Pointer Exception)是我们平时最容易碰到的,也是最令人讨厌的异常。本文介绍如何避免出现空指针异常。
首先我们看如下的示例:
private Boolean isFinished(String status) {
if (status.equalsIgnoreCase("Finish")) {
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
}
如果status的值为空的话,那么将会出现空指针异常(本例第2行)。所以我们应该使用如下的方法
private Boolean isFinished(String status) {
if ("Finish".equalsIgnoreCase(status)) {
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
}
这样的话,如果status为空,也不会出现空指针异常。相信我们大多数朋友已经知道这样的方法了,如果一个对象可能为null,那么不需要直接调用它的方法。
接下来我将接着提供几种避免空指针的建议。
1.判断Collection是否为空。
2.使用一些判断方法。
3.assert关键字。
4.Assert类。
5.异常处理。
6.太多的点.操作语法。
7.使用StringUtils类
1.判断Collection是否为空
Collection 为空是指Collection中没有元素。一些开发者如果碰到Collection中没有元素的时候,经常return null,
更好的做法是,你应该return Collections.EMPTY_LIST,Collections.EMPTY_SET或者是Collections.EMPTY_MAP.
错误的代码
public static List getEmployees() {
List list = null;
return list;
}
正确的代码
public static List getEmployees() {
List list = Collections.EMPTY_LIST;
return list;
}
2.使用一些判断方法
使用一些方法如:
contains(),indexOf(),isEmpty(),containsKey(),ContainsValue和hasNext()等来判断,确保不存在空值。
示例:
String myName = "qiyadeng"; List list = Collections.EMPTY_LIST;
boolean exist = list.contains(myName);
int index = list.indexOf(myName);
boolean isEmpty =list.isEmpty(); Map map =Collections.EMPTY_MAP;
exist=map.containsKey(myName);
exist=map.containsValue(myName);
isEmpty=map.isEmpty(); Set set=Collections.EMPTY_SET;
3.assert关键字
在Java1.4版本之后,提供了断言assert来确定你的代码中的假设。使用的语法如下:
assert expression1
expression1是一个boolean表达式,如果expression1返回的false,系统将会抛出AssertError(没有详细信息)。
另外一种使用方法
assert expression1:expression2
如果expression1返回false,那么系统将会抛出AssertError,并且详细信息为expression2。
示例:
public static String getManager(String employeeId) {
assert (employeeId != null) : "employeeId must be not null";
return "qiyadeng";
}
我使用getManager(null)来调用getManger方法,最后运行的结果是"java.lang.AssertionError:employeedId must be not null" 注意记得使用java选项中加入-enableassertion开启assertion功能。
4.Assert类
Assert类在com.bea.core.repackaged.springframework.util包中,有许多方法可以用于断言。
public static String getManager(String employeeId) {
Assert.notNull(employeeId, "employeeId must be not null");
Assert.hasLength(employeeId, "employeeId must has length greater than 0");
return "qiyadeng";
}
当我同样使用getManager(null)来调用getManager方法,将获得信息"java.lang.IllegalArgumentException: employeeId must be not null"。
5.异常处理
使用try catch处理异常或是检查变量是否为空。
public static String getManager(String employeeId) {
return null;
}
如上代码,我使用下面方法调用
String managerId = getManager("A015");
System.out.println(managerId.toString());
将会发生"java.lang.NullPointerException",为了处理这个异常,我们应该使用try catch来处理异常或者是检查变量是否为null。
try-catch方法
String managerId = getManager("A015");
try {
System.out.println(managerId.toString());
} catch (NullPointerException npe) {
//write your code here
}
或者是对变量进行检查
String managerId = getManager("A015");
if (managerId != null) {
System.out.println(managerId.toString());
} else {
//write your code here
}
6.不要太多的点.操作语法
一些开发者使用太多的这样的方法来减少代码,但是这个对后面的维护和异常处理都是不太好的。
错误的写法
String attrValue = (String)findViewObject("VO_NAME").getCurrentRow().getAttribute("Attribute_NAME");
正确的写法
ViewObject vo = findViewObject("VO_NAME");
Row row = vo.getCurrentRow();
String attrValue = (String)row.getAttribute("Attribute_NAME");
7.使用StringUtils类
StringUtil是org.apache.commns.lang包中的类,我们可以使用该类来避免空指针异常。
例如 StringUtils.isEmpty(),StringUtils.isBlank,StringUtils.equals()等等,更多的你可以参考文档。
为了不出现空指针异常,在写代码的过程中需要时刻检查你的代码是否会抛出NullPointerException,
如果你没有时间及时调整的话,使用//TODO标记,便于你后面解决问题。
个人建议在构建代码时,尽可能全面的考虑到各种变量的传递,有可能存在空指针错误的,一次性处理,考虑不全面的在使用//TODO标记,以便后续处理。
总结:有错误之处,烦请各路大神指点,共同学习,共同进步!!!
Java 中空指针处理方法的更多相关文章
- JAVA常见错误处理方法 和 JVM内存结构
OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...
- java中的native方法和修饰符(转)
Java中的native修饰符 今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法. public native String GSMMod ...
- Java中的native方法
博客引用地址:Java中的native方法 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地 ...
- 使用Java操作文本文件的方法详解
使用Java操作文本文件的方法详解 摘要: 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而 ...
- 转:JAVA常见错误处理方法 和 JVM内存结构
OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...
- java 里面的 native 方法
第一篇: 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地讲,一个Native Meth ...
- java没有指针
先说结论:java没有指针,它使用对象引用来替代指针 备注:c/c++的引用和java的引用完全不是一个东西 c/c++的引用是同一块内存的不同名字 java的引用指向一个对象,引用本身也占用了内存 ...
- 两种计算Java对象大小的方法
之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...
- 获取当前应用的系统路径工具类和java的System.getProperty()方法介绍
java的System.getProperty()方法可以获取的值,如下: 对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? /** ...
随机推荐
- C#语言基础——7月21日
C#语言基础 一.语言基础 (一).函数的四要素: 名称,输入,输出,加工(二).主函数.输出语句.输入语句: Static void Main(string[] args)//下划 ...
- 用js实现返回上一页
<a href="javascript :;" onClick="javascript :history.back(-1);">返回上一页</ ...
- [转]Arrays.sort()你应该知道的事
以下内容转自: 原文链接: programcreek 翻译: ImportNew.com- 刘志军 译文链接: http://www.importnew.com/8952.html --------- ...
- 如何管理好项目的DLL
.net fx自带的dll net fx自带的dll,直接添加,注意.net fx版本即可. 第三方类库 如果是第三方类库,使用NuGet从NuGet官网下载,比如json.net,jQuery等. ...
- Scala 入门——Eclipse开发环境搭建
Come From: http://lidrema.blog.163.com/blog/static/209702148201461145859142/ Scala: 一种类似java的编程.集成了面 ...
- 关于jquery计算页面元素数量
这段jquery计算页面元素数量代码,能不能刷新页面直接输出数量,而不用点计算按钮 <scriptsrc="http://ajax.googleapis.com/ajax/libs/j ...
- 关于Linux下C编译错误(警告)cast from 'void*' to 'int' loses precision
char *ptr; //此后省略部分代码 ) //出错地方 那句话的意思是从 void* 到 int 的转换丢失精度,相信看到解释有些人就明白了, 此问题只会出现在X64位的Linux上,因为在64 ...
- MySql插入记录时判断
我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...
- 【个人使用.Net类库】(1)INI配置文件操作类
开发接口程序时,对于接口程序配置的IP地址.端口等都需要是可配置的,而在Win Api原生实现了INI文件的读写操作,因此只需要调用Win Api中的方法即可操作INI配置文件,关键代码就是如何调用W ...
- SQLite实现Top功能
SQlite本身没有top功能,无法向TSQL一样下Select top 100 * from tb_table,但SQLite提供了一个Limit关键字用来取得相应行数的资料 具体语法实例:Sele ...