Head First Java学习:第十一章-异常处理

第十一章 异常处理

1、方法可以抓住其他方法所抛出的异常;异常总是丢回给调用方

  • 有风险、会抛出异常的程序代码:

        负责声明异常;创建Exception对象并抛出

  • 调用该方法的程序代码:

        在try中调用程序代码;在catch中捕获异常,并使用printStackTrace()获取有用信息。

 

举例:

// 有风险的代码
public void takeTest() throws BadException{
    if (abandonAllHope){
        throw new BadException();
    }
}

// 调用上述风险的程序代码
public void crossFingers(){
    try{
        anObject.takeTest();
    }catch (BadException ex){
        System.out.println("有异常");
        ex.printStackTrace();
    }
}

 

2、异常的分类

Exception:程序需要捕捉处理的异常,分为checked exception(检查异常)和unchecked exception(不检查异常)。

 

checked exception:方法在申明过程中证明了有检查异常抛出,调用该方法的时候,一定要处理(捕获或者向上抛出),否则无法编译通过。比如IOException。

如果我们希望我们的方法调用者,明确处理一些特殊情况的时候,就应该使用checked exception。

 

unchecked exception:一般是运行期异常,继承自RuntimeException。编写代码时不需要显示捕获。但是如果不捕获,运行期发生异常就会中断程序的执行。比如空指针异常、数组越界异常,这些都是可以避免的。一般是程序逻辑导致的异常。

 

3、异常的关键字:

throws 申明一个方法可能抛出的各种异常

throw 明确抛出一个异常,如 throw new BadException();

try 用来指定一块预防所有异常的程序

catch 指定你想要捕获的异常类型

finally 确保一段代码不管发生什么异常状态都要被执行

 

4、正确处理异常

方式一:自己明确知道如何处理。自己处理。

方式二:不知道如何处理。向上抛,交给调用者处理。

 

5、try、catch、finally的执行顺序

如果try块失败了:抛出异常,流程会马上转移到 catch块。catch块完成会转移到finally块。当finally执行完成时,就会继续执行其余部分。

 

如果try块成功了:流程会跳过catch块并移动到finally块。当finally执行完成时,就会继续执行其余部分。

 

如果try或catch块有return指令:finally还是会执行!流程会跳到finally,然后再回到return指令。

 

6、处理多重异常

举例:

public class Laundry{

public void doLaundry() throws PantsException,LingerieException{

    // 有可能抛出两个异常的程序代码

}

}

 

public class Foo{

public void go(){

    try{

        Laundry.do Laundry();

    }catch(PantsException pex){

        // 恢复程序代码

    } catch(LingerieException Lin){

        // 恢复程序代码

    }

}

}

 

7、异常也有多态

以为异常是对象,所以异常能够以多态的方式来引用。

比如IOException的对象,可以赋值给Exception的引用。

好处:

不用声明每个可能抛出的异常,可以只声明父类。

对于catch,可以不对每个可能的异常处理,只要一个或少数几个catch可以处理所有异常。

 

8、不想处理异常,那就 ducking

举例:

public class Washer {
    Laundry laundry = new Laundry();
    public void foo() throws ClothingException{
        laundry.doLaunrdy();
    }

    public static void main(String[] args) throws ClothingException{
        Washer a = new Washer();
        a.foo();
    }
}

 

调用方也声明相同异常,就会duck掉(踢皮球)。

posted @ 2022-05-11 20:09  hqq的进阶日记  阅读(50)  评论(0)    收藏  举报