zoukankan      html  css  js  c++  java
  • [置顶] 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) 

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/pangblog/p/3400132.html
Copyright © 2011-2022 走看看