异常在很多语言中都有,使用方法也是大同小异,基本的都是:
try{
//危险动作
}catch(Exception ex){
//尝试处理
}
因此卸载catch中的程序必定与所抛出的异常有关。注意异常Exception类型的对象可以是任何它的子类的实例。
还有一种情况是自己编写异常,抛出异常的时候必须声明异常。类似函数调用的过程。
1、有风险会抛出异常的程序代码
public void takeRisk() throws BadException {
if (abandonAllHope){
throw new BadException();
}
}
2、方法调用
Public void crossFigers()
{
try{
anObject.takeRisk();
}catch(BadExcetion ex){
system.out.println("throw error!")
ex.printStackTrace();
}
}
那异常到底是是如何进行控制的呢?
try{
Foo f = x.doRiskyThing();
int b = f.getNum();
}catch(Exception ex){
system.out.println("failed");
}
system.out.println("we made it!");
try模块会先执行如果执行成功的话,然后会跳过catch模块下面的部分。如果调用doRiskyThing()抛出异常,会跳过try中其他部分,直接运行catch块,然后继续下去。
那try-catch中还有一种finally的情况,就是无论是否成功,finally都会要执行的部分。例如想烹饪,就需要先打开炉子,如果烹饪失败了,需要把炉子关掉,如果烹饪成功了也需要把炉子关掉。因此将关掉炉子的部分无需既放在try中又放在catch中,将其公共流程统一放在finally中。
try{
trurnOverOn();
x.bake()
}catch(BakingException ex){
ex.printStackTrace();
}finally{
trurnOverOff();
}
- 如果try失败了,抛出异常,流程会转移到catch中,catch执行完了会到finally中
- 如果try成功了,流程会跳过catch并移动到finally中
- 如果try或者catch有return指令,finally还是会执行,流程会跳到finally中执行,然后再会到return指令
示例:
public class TestExceptions {
public static void main(String [] args) {
String test = "no";
try {
System.out.println("strart try");
//输入syso 按下alt+/快捷键
doRisky("test");
System.out.println("end try");
}catch(ScaryException se) {
System.out.println("scary exception");
}finally {
System.out.println("finally");
}
System.out.println("end of main");
}
static void doRisky(String test)throws ScaryException{
System.out.println("start risky");
if ("yes".equals(test)) {
throw new ScaryException();
}
System.out.println("end tisky");
return;
}
}