在Java中避免空指针异常(Null Pointer Exception)

空指针异常(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;  
exist=set.contains(myName);  
isEmpty=set.isEmpty();  
  
Iterator iterator;  
exist = iterator.hasNext();  
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标记,便于你后面解决问题。

原创文章,转载请注明: 转载自http://www.qiyadeng.com/

本文链接地址: 在Java中避免空指针异常(Null Pointer Exception)


作者简介:qiyadeng(www.qiyadeng.com)对互联网技术、运营及市场领域有浓厚的兴趣,喜爱思考、阅读、讨论;擅长Java开发及分布式技术。现专注于互联网的创新产品--老来宝(http://www.laolaibao.com),立志于帮助广大凤凰(diao)男(si)提供补充养老金管理平台。



  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值