java异常处理机制
java的异常处理机制
java对于异常的定义的结构是
Throwable类
派生出两个子类
Error与Exception
|——Error
系统级别出现的错误,通常是JVM出现的异常,这类错误是程序不可控的。
|——Exception
程序级别的错误。通常我们称之为异常。这一类问题是可以通过程序解决的。
Java中解决异常的步骤:
发现异常,捕获异常,解决异常。
try语句
语法格式:
try{
//可能出现错误的代码片段
}
catch语句
用于捕获try中出现的异常,并实现解决方式(要跟try一起使用)
try{
}catch(Exception_type e){
//解决异常的代码片段
}
catch语句可以出现多次。catch中列举的异常类型应本着子类在先父类在后的原则。
catch语句要出现在try语句之后。
try代码块中的内容是在尝试检查这块代码是否有问题,一旦碰到问题程序会立马跳到catch代码块尝试进行恢复或提示该处有异常(问题代码后的其他代码就不执行了)。catch段只有在发生异常时才会执行。
捕获异常的好习惯,要在最后一个catch中捕获Exception这个异常。
如果try块失败了,抛出异常,流裎会马上转移到catch块,当catch块完成时,会执行finally块。当finally完成时就会继续执行其余的部分。
如果try块成功,流程会跳过catch块并移动到finally块,当finally完成时就会继续执行其余的部分。
如果try或catch块有return指令,finally还是会执行!流程会跳到finally然后再回到return指令。
throw语句
主动抛出异常
语法
//e为某个异常的实例
throw e;
使用throw主动抛异常的情况:
1、分清责任。当调用该方法去处理问题的过程中出现错误,往往我们会将错误抛出,因为调用方有着决策上的权力。我们应当通知在这个环节出现的错误,以便调用方捕获并解决。
2、执行逻辑的过程中,出现了一个符合语法规则但是不符合业务逻辑要求的情况时,我们也可以当作异常去处理,这时我们也会主动抛出一个异常。
throws声明
throws用于声明方法要抛出的异常类型。
调用被throws声明的方法时,需要强制捕获该方法声明的抛出的异常。
通常在方法中,我们使用throw主动抛出的异常类型都要声明在throws中。
只有RuntimeException及其子类异常在throw抛出时,方法不需要将其异常类型定义在throws中。
RuntimeException及其子类属于非检查异常,指的是编译期间,不检查这类异常的捕获。
常见的RuntimeException子类
NullPointerException:当操作一个空引用时会出现此错误。
NumberFormatException:数据格式转换出现问题时出现此异常。
ClassCastException:强制类型转换类型不匹配时出现此异常。
ArrayIndexOutOfBoundsException:数组下标越界,当使用一个不存在的数组下标时出现此异常。
ArithmeticException:数学运行错误时出现此异常
参看API
throw与throws的区别?
动作 声明
finally块
finally块的语法
finally{
代码片段
}
finally块可以出现在try语句块之后,或者最后一个catch语句块之后。且只能出现一次。
finally块无论程序是否出错,都会执行其内容。无条件一定执行。
通常,我们的程序中,无论是否报错,都要执行的代码应该放在finally中,保证可以执行到。
重写方法时的异常处理(父类定义了异常)
如果在继承一个类时,父类的方法声明了throws抛出指定异常,那么子类在重写该方法时应该注意:
1、可以不指定throws
2、可以throws父类方法异常的子类异常
3、可以throws父类throws的部分异常(例如:父类抛了10个,子类抛8个可以)
不可以的情况:
1、throws父类方法throws的父类异常(爹抛NullPointerException,子不能抛NullPointerException的父类异常)
2、throws父类方法中没有throws的异常