第一阶段 12异常处理

异常

什么是异常?Java代码在运行时期发生的问题就是异常。

在Java中,把异常信息封装成了一个类。当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置、原因等)。

 

1.异常的体系

  所有的异常类是从java.lang.Exception类继承的子类

  Exception类是Throwable类的子类。除了Exception类外,Throwable还有一个子类Error

  Java程序通常不捕获错误。错误一般发生在严重的故障时,它们在Java程序处理的范畴之外。

  Error用来只是运行时环境发生错误

  异常类有两个主要的子类:IOException和RuntimeException类

 

2.异常与错误的区别

  异常:指程序在编译、运行期间发生了某种异常(XxxException),我们可以对异常进行具体的处理。若不处理异常,程序将会结束运行。

  错误:指程序在运行期间发生了某种错误(XxxError),Error错误通常没有具体的处理方式,程序将会结束运行。Error错误的发生往往都是系统级别的问题,都是jvm所在系统发生的,并反馈给jvm的。我们无法针对处理,只能修正代码。

 

3.抛出异常throw 

  在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。

 

  在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?

    <1>创建一个异常对象。封装一些提示信息(信息可以自己编写)。

 

   <2>需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw 异常对象;

 

    throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

 

使用格式:

 

throw new 异常类名(参数);

 

       例如:

 

    throw new NullPointerException("要访问的arr数组不存在");

 

    throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围");

 

4.声明异常throws

  声明:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。

  throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开。

 

5.捕获异常try--catch--finally

  捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理

 

   try:该代码块中编写可能产生异常的代码。

  catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。

  finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

 

6.try--catch--finally异常处理的组合方式

  try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。

  try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。

  一个try 多个catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。

  注:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

  try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。

 

7.自定义异常

    自定义异常类的定义

      通过阅读异常源代码:发现java中所有的异常类,都是继承Throwable,或者继承Throwable的子类。这样该异常才可以被throw抛出。

      说明这个异常体系具备一个特有的特性:可抛性:即可以被throw关键字操作。

      并且查阅异常子类源码,发现每个异常中都调用了父类的构造方法,把异常描述信息传递给了父类,让父类帮我们进行异常信息的封装。

posted @ 2018-04-24 11:59  <白泽>  阅读(109)  评论(0)    收藏  举报