空指针异常(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 中空指针处理方法的更多相关文章

  1. JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

  2. java中的native方法和修饰符(转)

    Java中的native修饰符 今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法. public native String GSMMod ...

  3. Java中的native方法

    博客引用地址:Java中的native方法 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地 ...

  4. 使用Java操作文本文件的方法详解

    使用Java操作文本文件的方法详解 摘要: 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而 ...

  5. 转:JAVA常见错误处理方法 和 JVM内存结构

    OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...

  6. java 里面的 native 方法

    第一篇: 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method   简单地讲,一个Native Meth ...

  7. java没有指针

    先说结论:java没有指针,它使用对象引用来替代指针 备注:c/c++的引用和java的引用完全不是一个东西 c/c++的引用是同一块内存的不同名字 java的引用指向一个对象,引用本身也占用了内存 ...

  8. 两种计算Java对象大小的方法

    之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...

  9. 获取当前应用的系统路径工具类和java的System.getProperty()方法介绍

    java的System.getProperty()方法可以获取的值,如下: 对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? /** ...

随机推荐

  1. 递归算法(一)——akm

    要求 已知akm函数如下: { n+1 while m=0 }                          => Rule I akm(m,n)= { akm(m-1,1) while n ...

  2. BZOJ一天提交 51纪念(二)

    今天作死又交了一发呢...于是屯题就全用完啦~ 有一次拷错CE,还有一次本来的程序就是错的的说... 可是我希望看到我努力的人并不会看到我的努力呢,尽管如此一个人也要坚持走到底哦,就如同这不完美的提交 ...

  3. android webview web里面的数据透传到java以及java的数据透传到web

    详见: http://tutorials.jenkov.com/android/android-web-apps-using-android-webview.html#android-web-app- ...

  4. javaMail创建邮件和发送邮件总结

    (注: 本文是参考http://www.cnblogs.com/xdp-gacl/p/4216311.html. 感谢博主的精彩的描述) 一, 前期的准备 1, 导入 mail.jar 二, 操作步骤 ...

  5. 使用 JavaScript 修改浏览器 URL 地址栏

    现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...

  6. C#解析Json(多方法解析Json 一)

    解析:{'id':'4028d80858053bed0158053ef7a50001','sl':0.0,'sfyfz':'0','zwjyzsbh':'1000001600000018'} 1.新建 ...

  7. IT公司100题-10-翻转句子中单词的顺序

    问题描述: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“Hello world!”,则输出“world ...

  8. 火狐和IE的window.event对象详解(转载)

    FF的FIREBUG,不仅能测试JS还能检查CSS错误,是一般常用的. 但它主要检查FF方面的错误,对IE就无能为力了. 要测试IE,就用ieTester,它可以测试IE几乎所有版本(1.0恐怕也用不 ...

  9. [windows驱动]标准驱动例程

    [注]routine:例行程序. 1.标准驱动例程简介: 每一个内核态驱动程序都是由一系列系统定义的,标准的驱动例程组成.内核态驱动在这些标准例程中通过调用系统提供的驱动支持函数处理I/O请求包.为了 ...

  10. 在hibernate中用sql语句

    在hibernate中用sql语句,语句是createSQLquery 查出来的是,一列或者多列的数据,要将其转化为对象,有两种方式, 对于已经被hibernate所管理的实体类,在后面加.adden ...