------- android培训、java培训、期待与您交流! ----------
一、 异常:是指程序在运行过程中的出现的一些不正常的情况,Java当中,利用面向对象的思想把这些异常的信息以及处理方式的代码都封装在了throwable类中,它是java语言中的所有错误或异常的超类,它里面定义了有关这些信息的最共性的东西。
异常体系的特点:异常体系中的所有的类(RuntimeException除外)以及建立的对象都具备可抛性,也就是可以被throw和throws关键字所操作,当函数内部有throw抛出异常对象时 ,并未进行try处理,必须要在函数上声明,否则,编译失败。
二、 异常的分类:根据异常问题的严重性,又把throwable体系分为exception和erro;
Exception:Exception类包含了一般性的异常,这些异常通常在捕捉到之后,经过有关异常代码的捕捉,程序还可以继续运行;
Erro:Error类专门用来处理严重影响程序运行的错误,可是通常程序设计者不会设计程序代码去捕捉这种错误,其原因在于即使捕捉到它,也无法给予适当的处理。
三、 异常的处理方式:
1) 在功能函数上,对有可能出现异常的函数通过throws Exception声明该功能有可能出现问题,让调用者知道,这样就用一个关键字“throws”,把问题抛给了调用者;
2) 在函数内部,对有可能出现异常的代码进行try-catch-fanally代码块的处理,其格式如下:
Try
{
需要被检测的代码
}
Catch(异常类 变量)
{
编写异常处理的代码,异常的处理方式
}
Finally
{
即使发生异常,程序跳转也一定会执行的代码;通常是 一些关闭资源的代码
}
注意:当函数内部出现了throw抛出异常时,要么在函数内部进行try-catch处理,那么必须在函数上声明,让调用者处理
四、 throws与throw的区别:
throws使用在函数上,后面跟的是异常类,可以跟多个,中间用逗号隔开;throw使用在函数内,后面跟的是异常对象。
值得注意的是:exception中有一个特殊的子类异常-RuntimeException(运行时异常),如果在函数内部抛出此异常,函数上是不用做声明的,编译一样可以通过,如果在函数上声明了该异常,调用者不用处理,编译照样通过。因为该异常是在程序运行过程中,出现了程序无法继续运行的情况,必须让程序停下来,对代码进行修正后,程序方可运行。
五、 异常在子类覆盖父类时的体现:
1) 子类在重写父类的方法时,如果父类方法抛出异常,那么子类的覆盖中,只能抛出父类的异常或者该异常的子类,或者不抛。
2) 如果父类方法抛出多个异常,那么子类在覆盖方法时,只能抛出父类方法的子集
3) 如果父类或接口 的方法中没有异常抛出,那么子类在覆盖父类方法时,也不可以抛出异常,如果子类发生 了异常,就必须进行try-catch处理,绝对不能抛出。
六、 自定义异常类:为了适应千变万化的程序代码环境,使得异常体系能够更好的完成扩展,java语言支持自定义异常类,只要让自定义的异常类继承Exception或者RuntimeException类,该类就具备了可抛性,具备了操作异常 的共性的方法;当要定义自定义异常的信息时,可以使用父类已经定义好的功能,把异常信息传递给父类的构造函数。
七、 异常处理的原则:
1) 一个try可对应多个catch,多个catch中,父类的catch放在最下面,catch块内,需要定义针对性的处理方式,不要简单的定义printStackTrace输出语句,也不要不写。
2) 当捕获到异常时,本功能处理不了时,可以在catch中继续抛出;
3) 如果该异常处理不了,但并不属于本功能出现的异常,可以将异常转换后,再抛出和本功能相关的异常,或者,异常可以处理,但需要将异常产生的和本功能相关的问题提供出去,让调用者知道并处理,也可以将捕获到的异常处理后,转换成新的异常抛出去。