一、什么是异常
异常主要是处理编译期不能捕获的错误,出现问题能继续顺利执行下去,而不导致程序终止,确保程序的健壮性。
处理过程 : 产生异常状态时,如果当前的contex不具备处理当前异常的能力,将在heap上new出来一个异常对象,停止当前的执行路线,把产生的异常对象抛给更高层的contex。
二、异常体系
Throable
| –Error
| – Exception
|–RuntimeException
三、异常体系的特点
异常体系中的所有类及建立的对象都具备可抛性
也就是说可以被 throw 和 throws 关键字所操作
只有异常体系具备这个特点
三、throw 和 throws 的用法
throw 定义在函数内,用户抛出对象
throws 定义在函数上,用于抛出异常类,可以抛出多个逗号隔开
四、异常处理
当函数内容有抛出 异常对象,并未进行try处理,必须要在函数上声明,否则编译失败
注意: RuntimeException 除外。也就是说,函数内部如果抛出 RuntimeException 异常,函数上可以不同声明
如果函数声明了异常,调用者 需要进行处理。处理方法可以是 throws 或者 try
五、异常的分类
1、编译时被检测异常 :
该异常在编译时,如果没有处理(没有抛出也没有try),编译失败
该异常被标识,代表可以被处理
2、运行时异常(编译时不检测)
在编译时,不需要被处理,编译器不检查
该异常发生时,建议不处理,让程序停止。需要对代码进行修正
六、异常处理的语句
1、格式
try
{
// 需要被检测的代码
}
catch()
{
// 处理异常的代码
}
finally
{
// 一定会执行的代码
}
2、三种届结合方式
1> 第一种
try
{
}
catch
{
}
2> 第二种
try
{
}
finally
{
}
3> 第三种
try
{
}
catch
{
}
finally
{
}
注意:
1、 finally 中定义的通常是 关闭资源的代码,因为资源必须释放。
2、finally 只有一种情况不会被执行。当执行到System.exit(0);finally 不会执行。
七、自定义异常
1、定义类继承 Exception 或者RuntimeException,是为了让该自定义类具备可抛性,让该类具备操作异常的共性方法
2、当要定义异常类的信息十,可以使用父类已经定义好的功能,将异常 的异常信息传递给父类的构造函数
class myException exception
{
myException (String message)
{
super(message);
}
}
3、自定义异常类的好处 : 按照java的面向对象思恋,将程序中出现特有的问题进行封装。
八、异常的好处
1、将问题进行封装
2、将正常流程代码和问题处理代码进行分离,方便阅读
九、异常的处理原则
1、处理方式有两种: try 或者 throws
2、 调用打抛出异常的功能时,抛出几个,就处理几个。也就是说,一个try对应多个catch
3、多个catch,父类的catch放到最下面(先子类后父类,详细的写在前面)
4、尽量去处理异常,切忌只是简单的调用printStackTrace()去打印输出
5、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗落的异常
6、当捕获到的异常,本功能处理不了时,可以继续在catch 块继续抛出。
try
{
throw new Aexception();
}
catch (Aexception e)
{
throw e;
}
7、当捕获异常,如果该异常处理不了,但并不属于该功能出现的异常,可以将异常转换后,再抛出和该功能相关的异常。 或者异常可以处理,但需要将异常产生后和本功能相关的问题提供出去,让调用者知道并处理,也可以将捕获异常处理后转换新的异常抛出
try
{
throw new AException();
}
catch(AException a)
{
// 对
throw new BException();
}
十、注意事项
参照这里