第16章 异常处理
2010年的中国上海世博会可谓家喻户晓,可是你知道吗,每年夏季,花果山也会举办隆重的蟠桃博览会,来自天上和人间的游客络绎不绝。游客们参观蟠桃博览会的正常流程是:
入花果山登记
游玩
离开花果山
偶尔也会发生一些异常情况,例如在游玩过程,有的游客迷了路,还有的游客忽然疾病发作。去年有一位小猪游客冒失地一口吞一只硕大的桃子,结果桃子卡在喉咙,由于未得到及时治疗,***给噎死了。
为了让游客能平平安安地在花果山游玩,对于今年的蟠桃博览会,悟空对可能出现的突发性异常提前做了充分准备。悟空动员一千只猴子充当蟠桃博览会的志愿者,如果游客迷了路,可以随时向志愿者问路。悟空还组织了若干支医疗队随时待命,以便及时抢救那些疾病发作的游客。
Java程序在运行过程中也会遇到异常情况,如果预先就估计到了可能出现的异常,并且准备好了处理异常的措施,那么就会防微杜渐,降低突发性异常发生时造成的损失。Java语言用try-catch语句来处理异常:public void travel(){ /* 模拟游客游览花果山蟠桃博览会的行为 */
try{
/* 正常流程 */
入花果山登记
游玩
离开花果山
}catch(迷路异常 e){ /* 处理迷路异常的流程 */
向志愿者询问路线
在志愿者的帮助下到达目的地
}catch(疾病发作异常 e){ /* 处理疾病发作异常的流程 */
找医疗队救助
}
}
本章将介绍Java语言提供的完善的异常处理机制。正确运用这套机制,有助于提高程序的健壮性。所谓程序的健壮性,就是指程序在多数情况下能够正常运行,返回预期的正确结果;如果偶尔遇到异常情况,程序也能采取周到的解决措施。而不健壮的程序则没有事先充分预计到可能出现的异常,或者没有提供强有力的异常解决措施,导致程序在运行时,经常莫名其妙地终止,或者返回错误的运行结果,而且难以检测出现异常的原因。
16.1 Java异常处理机制概述(1)
Java虚拟机用方法调用栈(method invocation stack)来跟踪一系列的方法调用过程。该堆栈保存了每个调用方法的本地信息(比如方法的局部变量)。当一个新方法被调用时,Java虚拟机把描述该方法的栈结构置入栈顶,位于栈顶的方法为正在执行的方法。图16-1描述了方法调用栈的结构。在图16-1中,方法的调用顺序为:main()方法调用methodB()方法,methodB()方法调用methodA()方法。
图16-1 Java虚拟机的方法调用栈
当methodB()方法调用methodA()方法,为了叙述的方便,本书有时把methodB()称为methodA()的方法调用者。
如果方法中的代码块可能抛出异常,有两种处理办法:
(1)如果当前方法有能力自己解决异常,就在当前方法中通过try-catch语句捕获并处理异常,例如:public void methodA(int status){
try{
//以下代码可能会抛出SpecialException
if(status==-1)
throw new SpecialException("Monster");
}catch(SpecialException e){
处理异常
}
}
(2)如果当前方法没能力自己解决异常,就在方法的声明处通过throws语句声明抛出异常,例如:public void methodA(int status) throws SpecialException{
//以下代码可能会抛出SpecialException
if(status==-1)
throw new SpecialException("Monster");
}
当一个方法正常执行完毕,Java虚拟机会从调用栈中弹出该方法的栈结构,然后继续处理前一个方法。如果在执行方法的过程中抛出异常,Java虚拟机必须找到能捕获该异常的catch代码块。它首先察看当前方法是否存在这样的catch代码块,如果存在,就执行该catch代码块;否则,Java虚拟机会从调用栈中弹出该方法的栈结构,继续到前一个方法中查找合适的catch代码块。
【责任编辑:云霞 TEL:(010)68476606】
点赞 0