[置顶] 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引起的。
相关阅读
OpenJDK源码研究过程中整理的学习笔记。 OpenJDK是GPL许可(GPL-licensed)的Java平台的开源实现。
原文参见:http://FansUnion.cn/articles/3013(小雷网-FansUnion.cn)
[置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)的更多相关文章
- OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)
可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...
- OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...
- OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法
本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法. 这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...
- OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常
OpenJDK源码研究笔记系列文章,是我在阅读OpenJDK7源码的过程中的一些体会.收获.看法. 把研究过程中的成长和收获一点点地整理出来,是对自己研究学习的一个小结,也有可能给学习Java的一些同 ...
- OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)
在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件 ...
- OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构
最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...
- OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计
前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...
随机推荐
- Wannafly挑战赛18 B - 随机数
思路:化简公式,Pn 表示 进行n 次操作,有奇数次1的概率 Pn = (1 - x) * Pn - 1 + x * (1 - Pn - 1) 得通项公式 Pn = (1 - (1 - 2 * x) ...
- [Codeforces166B]Polygons 凸包
大致题意: 给你一个凸多边形A,和一个任意多边形B,判断B是否在A的内部 先对A的点集建凸包,然后枚举B中的点,二分判断是否在A的内部. 二分时可用叉积判断,详细见代码 #include<cst ...
- java 数组的基本概念
1.数组的基本概念 数组指的是一组相关变量的集合.例如:如果说现在要定义100个整型变量,如果按照我们以前的思路,我们可能这样定义: public class demo { public static ...
- 初识GeneXus产品
本人由于工作原因接触了GeneXus产品,从使用到现在也有些年头了.从刚开始的不熟悉到现在使用GeneXus开发了很多项目,慢慢也总结了一些经验,当然中间也走了很多的弯路.对于在国内同样使用GeneX ...
- 【二分图最大匹配】【匈牙利算法】zoj3988 Prime Set
题意:给你n个正整数,一对和为素数的数为一个合法数对.你选不超过K个合法数对,使得你选的数对涉及到的数的数量最大化.输出这个值. 所有1之间是可以任意两两配对的. 把奇数放在左侧,偶数放在右侧. 考虑 ...
- 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树
这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...
- 【最小表示法】BZOJ1398-寻找朋友
[题目大意] 判断两个字符串是否循环同构. [思路] 我一开始的做法是直接同时在两个字符串上求最小表示法,只有部分测试点能过,理由未知,以后再来思考. 现在做法:分别求出两个字符串的最小表示法,再比较 ...
- 2017-2018-1 JAVA实验站 第三周作业
2017-2018-1 JAVA实验站 第三周作业 团队展示 队名 JAVA实验站 拟作的团队项目描述 (2048)增加其他模式,使得2048更加丰富多彩 团队的首次合照 团队的特色描述 团队内部很团 ...
- 【BZOJ】2131: 免费的馅饼
2131: 免费的馅饼 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 508 Solved: 310[Submit][Status][Discuss ...
- [转][译][Android基础]Android Fragment之间的通信
2014-2-14 本篇文章翻译自Android官方的培训教程,我也是初学者,觉得官方的Training才是最好的学习材料,所以边学边翻译,有翻译不好的地方,请大家指正. 如果我们在开发过程中为了重用 ...