首先,异常是什么?异常是在程序运行期间,出现了一个非法的运行状态。
打开API文档,输入Exception,得到关于Exception类的信息如下:Exception类的父类是Throwable类,同时,对于Exception的解释是:Exception
类及其子类是Throwable
的一种形式,它指出了合理的应用程序想要捕获的条件。
根据java的规则,我们可以得到这样的信息:
Throwable是所有异常及错误的“父亲”,其下分成系统错误Error和可捕获的异常Exception两类。系统错误Error是程序本身解决不了的错误,一般交由JVM处理,通常遇到这种错误时JVM会直接终止程序。而异常Exception是可以由程序捕获的错误,也就是说,程序可以捕获并抛出这一类的错误。
而Exception之下又可以分成两种,一种是IOException异常及其派生异常,一般出现在读写数据流时,也叫作非运行异常,这类异常大多是必须要处理的异常,否则程序一般不能通过编译。另一种是RuntimeException异常及其子类异常,也叫作运行时异常,是在程序运行中出现的,出现原因一般是逻辑错误,通过throw可随时抛出此类异常。
1、try…catch…finally捕获并抛出异常
具体程序语句如下:
try{ //可能发生运行错误的代码 } catch(异常类型 异常对象引用){ //用于处理异常的代码 } finally{ //用于善后的代码 }
该语句是发现异常并处理异常的基本句式,其作用为:当try语句块中的代码执行时发现异常,程序的正常运行便中断,并抛出异常对象,然后在try块后面的各个catch()中找到与异常对象相匹配的类。当异常对象符合下面三个条件之一时,就认为这个异常对象与对应的异常类相匹配。
(1)异常对象所属的类与catch()中参数类相同。
(2)异常对象所属的类是catch()中参数类的子类。
(3)catch()中的参数类是一个接口时,发生的异常对象类实现了这一接口。
最后,执行完catch中的代码后,程序恢复运行,但不会再回到异常发生处继续执行,而是会执行try-catch之后的语句,即finally语句块。
2、throw和throws抛出异常
throw可以直接人为抛出异常,有两种格式,如下:
直接抛出异常类实例
throw new ExceptionType(...); // ExceptionType是Throwable的子类
先定义异常类对象并实例化,然后抛出
ExceptionType e = new ExceptionType(...); throw e;
而如果在方法中不人为抛出异常,则必须在定义该方法时使用throws子句抛出异常。
例:
public class TestThrows { public static void main(String[] args) { FileInputStream fis = new; FileInputStream("a.txt"); } }
上段代码是错误的,应当在定义主方法时使用throws IOException。
所以,throws代码的格式如下:
修饰符 返回类型 方法名(参数列表)throws 异常类名列表{
…//方法体中的语句
}
总结:
try系列语句需要在尽量靠近异常的地方使用,否则时间复杂度会大大增加;尽量用具体的异常类型捕获并抛出异常,不要在代码中用catch(Exception)“吃掉”所有异常。