• 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标记,以便后续处理。

    总结:有错误之处,烦请各路大神指点,共同学习,共同进步!!!

  • 相关阅读:
    页面加载完没有其他操作的情况下直接获取音频时长为NAN问题
    关于mysql的一些操作
    阿里云服务器登录不上 提示:之前用于连接到 (公网ip) 的凭据无法工作(1核1G) 以及阿里云新版本安全组策略没有开启80端口导致网站只能ping通 访问不到的问题
    微信浏览器禁止页面下拉查看网址(不影响页面内部scroll)
    2018年11月17号第一次参加源创会记录
    使用了eclipse10年之后,我终于投向了IDEA
    spring/spring boot/spring cloud书籍推荐
    python数据库连接例子
    Spring Cloud Eureka配置文件例子与较为详细说明
    spring源代码下载并导入eclipse技巧
  • 原文地址:https://www.cnblogs.com/kings-boke/p/4249081.html
Copyright © 2020-2023  润新知