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)
最新文章
- Java设计模式之建造者模式(Builder)
- LNMP搭建(yum)
- sqlserver 服务器主体 无法在当前安全上下文下访问数据库
- 使用Fiddler对Android或者iOS设备进行抓包
- Ubuntu终端Terminal常用快捷键
- View (三) 视图绘制流程完全解析
- Valid Anagram
- SQL统计——按照各种维度
- C#学习笔记1:正则表达式和数据库连接
- 跨域、sql注入、xss攻击
- 第一次尝试使用JAVA编写的ATM机程序
- VS2008非托管C++调用wcf(WebService)服务
- easyui treegrid实现显示checkbox并能获取到选定值的
- 浅谈IOC
- C#对象比较的总结
- lcr电桥浅谈
- Vue.js——理解与创建使用
- rocketmq集群安装,配置,测试
- opencv图片转幻灯片视频
- 53-C++ CH08 01
热门文章
- (转载)7个去伪存真的JavaScript面试题
- 【原创】Linux下的ngix服务器安装步骤
- POJ 2481 Cows【树状数组】
- java的selenium环境搭建
- django 分组统计遇见的问题
- 箭头函数的this
- ping,telnet,ssh命令的理解
- 【Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B】 Code For 1
- cin详解(get()、getline()、clear()、sync())
- js绑定事件方法:addEventListener与attachEvent的不同浏览器的兼容性写法