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异常全在这呢,比课本可是全多了。

posted @ 2018-10-15 15:09  康先森  阅读(184)  评论(0编辑  收藏  举报