Java异常的产生和处理机制

[color=red]异常的产生[/color]
异常(Exception)就是程序在运行过程中发生的由于硬件、软件错误等导致的程序不正常事件。
程序代码本身的原因造成的错误理论上可以避免,有些如内存不足,文件操作等错误是不可预测,与运行环境有关。

[color=red]Java异常处理[/color]
当一个方法引发异常后,可将异常抛出,由该方法的直接或间接调用者处理这个异常。这就是catch-throw方式。
异常处理5个关键字:try、catch、throw、throws和finally。
系统产生的异常在Java运行时被系统自动引发,手动引发异常用throw,任何被引发方法的异常都必须通过throws子句定义,任何在方法返回前绝对被执行的代码都被放置在finally块中。
代码片段:
try{
//此处为可能产生异常的代码

}catch(ExceptionType1 ex1){
//捕获并处理类型为ExceptionType1的异常

}catch(ExceptionType2 ex2){
//捕获并处理类型为ExceptionType2的异常

}finally{
//try结束之前要执行的代码,通常此处进行释放资源的处理

}

异常在Java中也是作为类的实例形式出现,Java中所有异常类都是从Throwable中派生。

[color=red]Java抛出异常,Java可能抛出异常的情况:[/color]
检测到错误并使用throw语句抛出异常。
调用的方法抛出了异常。
程序代码有错误,导致异常,如数组越界。
Java运行时系统产生内部错误。

方法声明中指定可能产生的异常
格式如下:
public String getInput throws IOException,…
{}

不检查异常
从Error类中派生出的异常和从RuntimeException类中派生出的异常就不用在方法声明中指定,属不检查异常。

[color=red]异常与重载 [/color]
方法的重载的定义:派生类可以继承到父类中定义的方法,同时又可以重写自己的与父类中同名并且同参数同返回类型的方法,这种机制称为方法的重载。

当子类的方法重载了父类的方法时,子类方法的throws子句中声明的异常不能多于父类方法中声明的异常,否则产生编译错误,对接口情况相同。

异常子类必须在它们任何父类之前使用。

try语句可以嵌套,如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之后匹配。每次进入try,异常的前后关系被推入堆栈。

[color=red]
抛出异常的例子[/color]
异常处理的关键字
throws --- 声明异常
throw --- 抛出异常
try&catch --- 捕获异常
finally --- 其中的代码在try中语句结束前执行

例子:
class ThrowsDemo{
public static void throwOne() throws Exception1,Exception2,…{
System.out.println(“throwOne 方法”);
throw new Exception1(“异常1”);
}
public static void main(String args[]){
try{
throwOne();
}catch(Exception1 e){
System.out.println(“Caught “+e);
}
}
}

[color=red]
使用finally子句[/color]
当Java程序抛出一个异常的时候,他会停止处理这个方法中剩下的代码,而寻找捕获异常的catch子句或者直接不正常退出方法。如果在方法中已经分配了一些资源,或者打开文件,在异常后就不会释放资源或关闭文件。Java中提供了finally子句来处理:
try{
//正常代码,可能有异常
。。。
}catch(异常类1 e){
//异常类1的处理代码
。。。
}catch(异常类2 e){
//异常类2的处理代码
。。。
}finally{
//执行清除工作的语句
。。。
}

[color=red]finally中语句总会执行[/color]
Try块中无异常,执行try块中代码,然后执行finally子句中的代码,最后执行try…catch…finally块后面的代码。

try块中的语句产生了异常,而此异常在方法内被捕获。Java首先执行try块代码直到异常处,然后跳过try块中剩下代码,执行捕获此异常的catch子句的处理代码,然后执行finally子句中代码。如果catch子句中没有重新抛出异常,那么Java将执行 try…catch…finally块后面的代码。如果在catch子句又重新抛出了异常,那么Java将这个异常抛出给方法的调用者。

try块中产生异常,而此异常在方法内没有被捕获。该情况下,Java将执行块中代码直到异常处,后跳过try块中代码而转去执行finally子句中代码,最后将异常抛出给方法调用者。

finally子句是可选的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值