高级java
软件工程师培训讲义
Java异常处理
本课内容
?????
抛出异常捕获异常和抛出异常的结合使用方法覆盖时的异常处理自定义异常printStackTrace()方法
抛出异常?声明抛出违例是Java中处理违例的第二种方式
在定义一个方法的时候,如果并不能确定如何处理其中可能出现的异常,可以不在方法中对异常进行处理,而是将可能发生的异常让这个方法的调用者来处理
?可以对下列情形在方法定义中抛出异常:
–方法中调用了一个会抛出“已检查异常”的方法–
程序运行过程中发生了错误,并且用throw子句抛出了一个“已检查异常”
抛出异常
声明抛出举例:
publicvoidreadFile()throwsFileNotFoundException{……//读文件的操作可能产生FileNotFoundException类型的违例FileInputStreamfis=newFileInputStream(“file.txt”);..……}
?
方法中抛出异常的格式
methodName([])throws{//……}
?
不要抛出如下异常:从Error中派生的那些异常从RuntimeException中派生的那些异常,如NullPointerException等
Java异常调用栈机制
?如果一个异常没有在当前的try-catch模块中得到处理,则它会抛出到它的调用方法。?如果一个异常回到了main()方法,仍没有得到处理,则程序会异常终止。
主动抛出异常
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要人工创建并抛出
首先要生成异常对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。
IOExceptione=newIOException();throwe;
可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:thrownewString("wanttothrow");
捕获和抛出结合使用
?捕获异常和抛出异常的方式,并不是排它的,它们可以结合起来使用:
methodA()throwsXXXException{try{//somecodehere…}catch(XXXExceptione){//somecodehere…throwe;}}methodB(){try{
methodA()
}catch(XXXExceptione){//对methodA()抛出的异常进行处理}}
重写方法声明抛出违例原则
重写方法不能抛出比被重写方法范围更大的违例类型
importjava.io.*;publicclassA{publicvoidmethodA()throwsIOException{……}}importjava.io.*;publicclassB1extendsA{publicvoidmethodA()throwsFileNotFoundException{//ok……}}publicclassB2extendsA{publicvoidmethodA()throwsException{//error……}}
方法覆盖中的异常
?当子类中的方法覆盖父类中的方法时,可以抛出异常?覆盖方法抛出的异常,可以抛出与被覆盖方法的相同的异常或者被覆盖方法的异常的子类异常
方法覆盖中的异常例子
importjava.io.*;publicclassParent{publicvoidmethodA()java.lang.Exception|throwsIOException,RuntimeException{java.lang.RuntimeExceptionjava.io.IOException//IO操作}java.io.IOException|}