Java try-catch异常相关(part2)
1.finally
finally代码块:定义了一定会执行的代码,通常用于关闭资源。
2.try-catch-finally的其他格式
1 //第一个格式: 2 try{ 3 4 }catch () 5 { 6 7 }finally 8 { 9 10 } 11 //第二个: 12 try{ 13 14 }catch () 15 { 16 17 } 18 //第三个 19 try{ 20 21 }finally 22 { 23 //关资源 24 }
catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是检测时异常,那么必须声明。
3.异常在子父类覆盖时的特点
1.子类在覆盖父类的时候,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
1 class AException extends Exception 2 { 3 4 } 5 class BException extends AException 6 { 7 8 } 9 class CException extends Exception 10 { 11 12 } 13 class Fu 14 { 15 void show()throws AException 16 { 17 18 } 19 } 20 class Zi extends Fu 21 { 22 void show()throws AException,BException//只能抛父类抛出的异常或者其异常的子类。 23 { 24 25 } 26 }
层级关系就像下面这样
Exception
|--AException
|--BException
|--CException
很显然,只能抛出AException和BException,抛CException或者Exception会报错的。。
理解起来也比较简单,子类再抛新异常,如果多态父类就解决不了了。
2.如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
这个也很好理解,只要让父类能解决,啥都好说。
3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法的时候也不可以抛出异常。如果子类方法发生了异常,就必须要进行try处理。
4.异常部分的总结
①异常就是对问题的描述,对问题进行封装。
异常体系如下:
Throwable
|--Error
|--Exception
|--RunTimeException
②异常体系的特点:
异常体系中的所有类以及建立的对象都具有可抛性,也就是说可以被throw和throws所操作。只有异常体系有这个特点。
③throw和throws的用法
throw定义在函数内,用于抛出异常对象。
throws定义在函数上用于抛出类,可以抛出多个并用逗号隔开。
④函数声明相关
当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。但是RunTImeException除外。也就是说,函数内如果抛出RunTimeException异常,函数上可以不声明。
如果函数声明了异常,调用者需要进行处理,处理方法可以是throw也可以try-catch。
⑤异常分类
异常有两种:编译时异常和运行时异常。
编译时异常:该异常在编译时,如果没有处理(没throw没try)就会编译失败。异常被标示了,就说明他可以被处理。
运行时异常:编译时不检测,也不检查不处理。这种异常发生时建议就不要处理了,让程序停止,需要对代码进行修正。
④finally
finally中定义的通常是关闭资源代码,因为资源必须释放。而且finally只有一种情况不会执行,就是执行到
System.exit(0);
finally不会执行。
⑤自定义异常
按照Java面向对象的思想,将程序中出现的特有的问题进行封装。
就是让定义的类继承Exception或者RuntimeException。一是为了让该自定义类具备可抛性,二是让该类具备操作异常的共性方法。
当要定义自定义异常的信息时,可以使用父类已经定义好的功能,将异常信息传递给父类的构造函数。
1 class MyException extends Exception 2 { 3 MyException(String message) 4 { 5 super(message); 6 } 7 }
⑥异常的好处
一是将问题进行了封装,二是将正常流程代码和问题处理代码相分离,方便于阅读。
⑦异常的处理原则
1.有两种处理方式:try或者throw
2.调用到抛出异常的功能时,抛出几个就处理几个,一个try对应着多个catch
3.多个catch,父类的catch放在最下面。
4.catch内,需要定义针对性的处理方式,不要简单的定义printStacktrace和输出语句,也别不写。当捕获到的异常在本功能里面处理不了时,可以继续在catch里抛出。
1 try 2 { 3 throw new AException; 4 } 5 catch(AException e;) 6 { 7 throw e; 8 }
如果该异常处理不了,但是并不属于该功能出现的异常,可以将异常转换后,再抛出和该功能相关的异常。或者异常可以处理,当需要将异常产生和本功能相关的问题提供出去,让调用者知道并处理。也可以将捕获异常处理后,转换新的异常。
1 try 2 { 3 throw new AException; 4 } 5 catch(AException e;) 6 { 7 throw new BException; 8 }
⑧异常的注意事项
在子类覆盖时:
1.子类抛出的异常必须是父类的异常的子类或者子集。
2.如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。
好了,Java异常全在这呢,比课本可是全多了。