1、什么是异常?
程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。
Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。Throwable派生出Error类和Exception类。
Error:Error类以及它的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现,一旦出现Error程序就挂了,最常见的就是OutOfMemoryError,StackOverFlowError,UnknownError。
Exception:Exception以及它的子类,代表程序运行时发生的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。
异常也可以分为两类:非检查异常,检查异常。
非检查异常:Error和RuntimeException以及它们的子类。Javac在编译时,不会提示和发现这样的异常,不要求程序处理这些异常。如:ArithmeticException,ClassCastException,ArrayIndexException,NullPointException。
检查异常:除了Error和RuntimeException的其他异常。javac强制要求程序员为这样的异常做预备处理工作(使用try...catch...finally或者throws)。如:SQLException,IOException,ClassNotFoundException。
对于检查和非检查是对于Javac来说的。
2、try,catch,finally,throw,throws介绍。
try后紧跟一个花括号括起来的代码块(花括号不可以省略),简称try块。catch后对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块。catch块后可以跟finally块,用于处理try块打开的物理资源,异常机制会保证finally块总被执行。throws关键字主要用在方法签名上。throw可以作为单独语句使用,抛出一个具体的对象。
注意:
- 不管程序代码块是否处于try块中,甚至包括catch块中的代码,只要执行该代码块时出现异常,系统会自动生成一个异常对象。如果程序没有为这段代码定义任何的catch块,则Java运行环境无法找到处理该异常的catch块,程序就在此退出。
- try块里声明的变量是代码块内的局部变量,它只在try块内生效,在catch中不能访问。
- 在异常捕获时,不仅应该把Exception类对应的catch块放在最后,而且所有的父类异常catch块都应该排在子类的异常catch块的最后面(简称:先处理小异常,再处理大异常),否则将出现编译错误。
- 除非在try块、catch块中主动调用了退出虚拟机的方法,否则不管在try块、catch块中执行怎样的代码,出现怎样的情况,异常处理finally块总会被执行。
- 通常在finally块中不使用return或throw语句。将会导致try块和catch块中的return、throw语句失效。
3、异常处理规则
一般异常处理有四个目标:
- 使程序代码混乱最小。
- 捕获并保留诊断信息。
- 通知适合的人员。
- 采用合适的方式结束异常活动。