• OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)


    可恨的异常

    程序开发过程中,最讨厌异常了。

    异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息。

    看着就让人心烦。

    对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧。

    可亲的异常

    但是,如果我们反过来看,异常可是非常好的错误提示。

    在JDK中,定义了大量的异常,只要程序抛出了异常,我们根据异常的名字就能知道程序大概出了什么问题。

    比如看到NullPointerException,我们就知道方法所属的对象是Null。

    看到IndexOutOfBoundsException,我们就晓得数组的索引不在合法范围之内。

    对于一个程序老鸟来说,看到异常的名字,就能够镇定自若,很快搞定问题。

    没有异常,才是最难解决的问题。

    最佳实践

    熟悉JDK中的异常,知道异常所代表的问题和发生的原因,才能够更好地更快地解决实际编程问题。

    预防胜于救火。

    知道经常会出现哪些异常,才能够写出更加健壮的程序,才能够更加周全的考虑问题。

    异常举例

    下面这5个异常,出自java.lang包。更多异常,请参考OpenJDK源码,或JDK API参考手册。

    ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。

    ArrayIndexOutOfBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

    ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。

    IndexOutOfBoundsException: 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。

    StringIndexOutOfBoundsException:此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。对诸如 charAt 的一些方法,当索引等于字符串的大小时,也会抛出该异常。

    典型案例

    public class NullPointerException extends RuntimeException {
     private static final long serialVersionUID = 5162710183389028792L;
    
     /**
      * Constructs a {@code NullPointerException} with no detail message.
      */
     public NullPointerException() {
      super();
     }
    
     /**
      * Constructs a {@code NullPointerException} with the specified detail
      * message.
      *
      * @param s
      *            the detail message.
      */
     public NullPointerException(String s) {
      super(s);
     }
    }


    上述代码出自,OpenJDK源码包中的java.lang.NullPointerException。

    我们可以看出,一个异常的定义非常简单,除了定义无参和有参的构造函数之外,没有别的任何业务方法。

    异常很简单,就是用来清晰地表明程序发生的异常或错误。

    代码示例

    import java.util.List;
    
    public class NullPointerExceptionExample {
    
     public static void main(String[] args) {
      List list = null;
      // 正常
      getLastGood(list);
      // 报错
      getLastBad(list);
     }
    
     // 不够健壮的代码
     public static Object getLastBad(List list) {
      // 如果传入的list为null,就会抛出NullPointerException
      int lastIndex = list.size() - 1;
      return list.get(lastIndex);
     }
    
     // 健壮的代码
     public static Object getLastGood(List list) {
      if (isEmpty(list)) {
       return null;
      }
      int lastIndex = list.size() - 1;
      return list.get(lastIndex);
     }
    
     // 判断一个list是否含有元素
     private static boolean isEmpty(List list) {
      boolean empty = false;
      if (list == null || list.size() == 0) {
       empty = true;
      }
      return empty;
     }
    }


    异常信息

    Exception in thread "main" java.lang.NullPointerException
     at NullPointerExceptionExample.getLastBad(NullPointerExceptionExample.java:16)
     at NullPointerExceptionExample.main(NullPointerExceptionExample.java:10)

    看到异常信息,我们很快就可以知道,第16行代码“  int lastIndex = list.size() - 1;”有问题。

    而且,仔细看看这行代码,可以确定就是list为null引起的。

    相关阅读

    我的CSDN博客专栏  OpenJDK源码研究笔记

    OpenJDK源码研究过程中整理的学习笔记。 OpenJDK是GPL许可(GPL-licensed)的Java平台的开源实现。

    原文参见http://FansUnion.cn/articles/3013 (小雷网-FansUnion.cn) 

  • 相关阅读:
    samba中的pdbedit用法
    服务器批量管理工具【转载】
    Linux网卡bounding详解
    Windows下为MySQL做定时备份
    对于新安装的MySQL如何提升MySQL的安全级别
    为Apache动态增加模块
    DSO动态加载PHP模块到Apache服务器
    系统网页打不开,排查故障步骤
    Low overhead memory space management
    pip 升级 Appium-Python-Client
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463489.html
Copyright © 2020-2023  润新知