java炒冷饭系列07 java标准异常
来源:互联网 发布:linux root环境变量 编辑:程序博客网 时间:2024/06/11 11:43
前言
Throwable这个Java类被用来表示任何可以作为异常被抛出的类。Throwable对象可分为两种类型(指从Throwable继承而得到的类型):
- Error用来表示编译时和系统错误(除特殊情况处,一般不用你关心)
- Exception是可以被抛出的基本类型
在Java类库、用户方法以及运行时故障中都可能抛出Exception型异常。所以Java程序员关心的基类型通常是Exception
要想对异常有全面的也解,最好去浏览一下HTML格式的Java文档。为了对不同的异常有个感性的认识,这么做是值得的,所以在书中简单罗列它们毫无意义。所使用的第三方类库也可能会有自己的异常。对异常来说,关键是理解概念以及如何使用。
异常的基本的概念是用户名称代表发生的问题,并且异常的名称应该可以望文知意。异常并非全是在java.lang包里定义的;有些异常是用来支持其他像util、net 和 io这样的程序包,这 些异常可以通过它们的完整名称或者从它们的父类中看出端倪。比如,所有的输入/输出异常都是从java.io.IOException继承而来的
特例 RuntimeException
if(t == null) throw new NullPointerException();
如果必须对传递给方法的每个引用都检查其是否为null(因为无法确定调用者是否传入了非法引用),这听起来着实吓人,幸运的是,这不必由你亲自来做,它属于java的标准运行时检测的一部分。如果对null引用进行调用,Java会自动抛出NullPointerException异常,所以上述代码是多余的,尽管你也许想要执行其他的检查以确保NullpointerException不会出现。
属于运行时异常的类型有很多,它们会自动被Java虚拟机抛出,所以不必在异常说明中把它们列出来。这些异常都是从RuntimeException类继承而来,所以既体现了继承的优点,使用起来也很方便。这构成了一组具有相同特征和行为的异常类型。并且,也不再需要在异常说明中声明方法将抛出RuntimeException类型的异常(或者任何从RuntimeException继承的异常),它们也被称为“不受检查异常”。这种异常属于错误,将被自动捕获,就不用你亲自动手了。要是自己去检查RuntimeException的话,代码就显得太混乱了。不过尽管通常不用捕获RuntimeException异常,但还是可以在代码中抛出RuntimeException类型的异常。
如果不捕获这种类型的异常会发生什么事呢?因为编译器没有在这个问题上对异常说明进行强制检查,RuntimeException类型的异常也许会穿越所有的执行路径直达main()方法,而不会被捕获。要明白到底发生了什么,可以试试下面的例子
public class NeverCaught { static void f(){ throw new RuntimeException("From f()"); } static void g(){ f(); } public static void main(String[] args) { g(); }}
可能读者已经发现,RuntimeException(或任何从它继承的异常)是一个特例。对于这种异常类型,编译器不需要异常说明,其输出被报告给了System.err:
Exception in thread "main" java.lang.RuntimeException: From f() at com.jianglei.p12.c5.NeverCaught.f(NeverCaught.java:8) at com.jianglei.p12.c5.NeverCaught.g(NeverCaught.java:12) at com.jianglei.p12.c5.NeverCaught.main(NeverCaught.java:16)
所以答案是:如果RuntimeException没有被捕获而直达main(),那么在程序退出前将调用异常的printStackTrack()方法。
请务必记住:只能在代码中忽略RuntimeException(及其子类)类型的异常,其他类型异常的处理都是由编译器强制实施的。究其原因RuntimeException代表的是编程错误:
- 无法预料的错误。比如从你控制范围之外传递进来的null引用。
- 作为程序员,应该在代码中进行检查的错误。(比如对于ArrayIndexOutOfBoundsException,就得注意一下数组的大小了。)在一个地方发生的异常,常常会在另一个地方导致错误。
你会发现在这些情况下使用异常很有好处,它们能给调试带来便利。
值得注意的是:不应把Java的异常处理机制当成是单一用途的工具。是的,它被设计用来处理一些烦人的运行时错误,这些错误往往是由代码控制能力之外的因素导致的;然而,它对于发现某些编译器无法检测到的编程错误,也是非常重要的。
参考文献
《Java编程思想》12.7 Java标准异常
- java炒冷饭系列07 java标准异常
- java炒冷饭系列06 异常匹配
- java炒冷饭系列06 异常说明(throws)
- java炒冷饭系列01 方法的重载
- java炒冷饭系列02 方法的重写
- java炒冷饭系列03 接口修饰符
- java炒冷饭系列08 try-with-resources
- java炒冷饭系列14 内部类标识符
- java炒冷饭系列04 初始化及类的加载
- java炒冷饭系列12 嵌套类(静态内部类)
- java炒冷饭系列13 内部类的继承
- Java 标准异常
- JAVA标准异常
- java炒冷饭系列05 使用多态时需要注意的几点
- java炒冷饭系列09 内部类的创建和链接到外部类
- java炒冷饭系列10 内部类 使用.this与.new和向上转型
- java炒冷饭系列11 方法和作用域内的内部类 与 匿名内部类
- JAVA标准系列(JMX)
- 水——洛谷P1407 工资
- 快速排序中的套路
- 以太坊连载(二):如何使用Homestead文档及以太坊路线图
- Ubuntu中两个Python时,怎么使用pip
- 自定义状态机
- java炒冷饭系列07 java标准异常
- 基于Spring的AOP编程
- QTabWidget样式案例
- 为工厂分配用于公司间Invoice的销售范围
- 显、隐式Intent的两种方式
- POJ 1485 Fast Food 笔记
- 2017-04-30 每日一记 解析XML文件:Content is not allowed in prolog.
- Java并发
- 日语语法整理二