java空指针漏洞利用_在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标记,便于你后面解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值