Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 375|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-6-6 10:50
  • 签到天数: 750 天

    [LV.10]以坛为家III

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    706216
    发表于 2021-8-28 11:01:53 | 显示全部楼层 |阅读模式

    空指针异常(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)

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-17 20:18 , Processed in 0.088679 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表