首页 > Linux操作系统 > Linux操作系统 > 第八章异常喝断言 二、(1)
二、异常的处理
Java提供了一种异常处理模型,它使您能检查异常并进行相应的处理。它实现的是异常处理的抓抛模型。使用此模型,您只需要注意有必要加以处理的异常情况。Java提供的这种异常处理模型,代替了用返回值或参数机制从方法返回异常码的手段。
异常处理的抓抛方法有两大优点:
(1):异常情况能仅在有必要之处加以处理,而不在其发生处和需要进行处理处之间的每一级上均进行处理;
(2):能够编写统一的、可重用的异常处理代码。
应该区别对待程序中的正常控制流和异常处理流。当然,异常处理流也是程序中的控制流。当异常发生时,抛出一个异常。异常伴随调用链,直到它们被捕获或程序退出为止。
下面是Java语言中的异常处理块的模型:
try{
//放置可能出现异常的语句序列,一旦发生异常,马上转入catch语句的匹配
}catch(Exception1 el){
//如果try块抛出异常对象的类型为Exceptionl,那么就在这里进行处理
}catch(Exception2 e2){
//如果try块抛出异常对象的类型为Exception2,那么就在这里进行处理
}catch(ExceptionN eN){
//如果try块抛出异常对象的类型为ExceptionN,那么就在这里进行处理
}finally{
//不管是否有异常发生,始终执行这个代码块
}
在未提供适当异常处理机制的程序中,无论何时发生异常,程序均会异常中断,而之前分配的所有资源则保持其状态不变。这会导致资源遗漏。要避免这一情况,在适当的异常处理机制中,我们可以将以前由系统分配的所有资源返还给系统。所以,当异常可能发生时,要牢记必须对每一异常分别进行处理。
例如我们处理文件I/O,在打开文件时发生IOException,程序异常中断而没有机会关闭该文件,这可能会毁坏文件而且分配给该文件的操作系统资源可能未返还给系统。
1.try块
try块由一组可执行语句组成,在执行它们时可能会抛出异常。try块后可随一个或多个catch块,用来捕获在try中抛出的异常。另一方面,try不可以跟随在catch块之后。
也就是说:在try语句块中包含可能会产生异常的语句
int demo=0;
try{
System.out.println(20/demo);
}
语句 System.out.println(20/demo);
会抛出一个异常,原因是试图用0去除一个数。程序会被成功编译,但当运行该程序时,程序将会发生异常而中断,异常可在catch块中被捕获,try块可以嵌套:
try{
语句 1;
语句 2;
try{
语句3;
语句4;
}catch(Exception1 e){
//异常处理
}
}catch(Exception2 e){
//异常处理
}
try块嵌套时,首先执行内部的try块,该块中引发的任何异常在随后的catch中被捕获;如果未发现与该内部块匹配的catch块,则检查外部try块的catch块;如果发现匹配的catch块,那么在该块中处理这一异常,否则Java运行时环境(JRE)处理这一异常。
2.catch块
catch块,从其名称就可以看出,是用来捕获并处理try中抛出的异常的代码块。没有try块,catch块不能单独存在,我们可有多个catch块,以捕获不同类型的异常。下面是catch块的语法
try{
}catch(异常类型 e){
}
这里,e是异常类型类的对象的引用,利用这一对象,我们可以输出这一异常的详细信息
下面是catch/try块的一个简单示例:
class TryClass{
public static void main(String args[]) {
int demO=0;
try{
System.out.println(20/demO);
}catch(ArithmeticException a){
System.out.println(“Can not divided by zero”);
}
}
}
上述程序的输出结果是:Can not devided by zero
注意:当多个catch块存在的时候,从上往下catch异常的范围应该从小到大,因为catch块的运行机制是找到一个匹配的就进行处理了,如果把范围大的放在前面,那么后面的代码就没有机会运行了,这会是一个编译异常,示例如下:
比如下面这个是正确的:
public class Test {
public static void main(String[] args) {
try{
int i = 5/0;
}catch(ArithmeticException e){
e.printStackTrace();
}catch(Exception err){
err.printStackTrace();
}
}
}
而下面这个就是错误的了,编译都发生了错误:
public class Test {
public static void main(String[] args) {
try{
int i = 5/0;
}catch(Exception err){
err.printStackTrace();
}catch(ArithmeticException e){
e.printStackTrace();
}
}
}
Java私塾跟我学系列——JAVA篇 网址:http://www.javass.cn 电话:010-68434236来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26660100/viewspace-715816/ ,如需转载,请注明出处,否则将追究法律责任。