第十一章 异常处理

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掉(踢皮球)。

Head First Java学习:第十一章-异常处理的更多相关文章

  1. “全栈2019”Java多线程第二十一章:同步代码块产生死锁的例子

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. “全栈2019”Java多线程第十一章:线程优先级详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java异常第二十一章:finally不被执行的情况

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  4. “全栈2019”Java异常第十一章:重写方法时只能抛出父类异常子集

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  5. “全栈2019”Java第一百一十一章:内部类可以被覆盖吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. “全栈2019”Java第八十一章:外部类能否访问嵌套接口里的成员?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. “全栈2019”Java第七十一章:外部类访问静态内部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第六十一章:如何实现接口?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第五十一章:继承与final关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. “全栈2019”Java第三十一章:二维数组和多维数组详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. 【NestJS系列】核心概念:Module模块

    theme: fancy highlight: atelier-dune-dark 前言 模块指的是使用@Module装饰器修饰的类,每个应用程序至少有一个模块,即根模块.根模块是Nest用于构建应用 ...

  2. 弹性数据库连接池探活策略调研(一)——HikariCP

    调研背景: 数据库连接建立是比较昂贵的操作(至少对于 OLTP),不仅要建立 TCP 连接外还需要进行连接鉴权操作,所以客户端通常会把数据库连接保存到连接池中进行复用.连接池维护到弹性数据库(JED) ...

  3. 《Python魔法大冒险》007 被困的精灵:数据类型的解救

    小鱼和魔法师深入魔法森林,树木之间流淌着神秘的光芒,每一片叶子都似乎在低语着古老的咒语.不久,他们来到了一个小湖旁,湖中央有一个小岛,岛上困着一个透明的泡泡,里面有一个悲伤的精灵. 小鱼看着那个精灵, ...

  4. 在微服务环境下,远程调用feign和异步线程存在请求数据丢失问题

    一.无异步线程得情况下feign远程调用: 0.登录拦截器: @Component public class LoginUserInterceptor implements HandlerInterc ...

  5. Modbus转profinet网关连接1200PLC在博图组态与英威腾驱动器通讯程序案例

    Modbus 转 profinet 网关连接 1200PLC 在博图组态与英威腾驱动器通讯程序案例 本案例给大家介绍由兴达易控 modbus 转 profinet 网关连接 1200PLC 在博图软件 ...

  6. 算法2:寻找吸血鬼数(JS)

    任务二:寻找吸血鬼数 打印所有4位吸血鬼数和它们的獠牙   提示:一共有7个: 吸血鬼数: -该鬼的位数为偶数: -该数的所有位中.是0的位少一半: -该数每一位上的数字重新组合为两个位数相等的数,乘 ...

  7. Arduino 麦克风声音传感器指南

    麦克风声音传感器 麦克风声音传感器,顾名思义,检测声音.它可以测量声音的响度. 这些传感器的种类繁多.  在下图中,您可以看到 Arduino 最常用的. 最左边是KY-038,右边是LM393麦克风 ...

  8. isHex

    public class Test { public static boolean isHex(String str) { boolean isHexFlg = true; int i = 0; ch ...

  9. 今天的第二道tarjan:受欢迎的牛

    原题来自:USACO 2003 Fall 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&quo ...

  10. List集合异常:list All elements are null

    查询数据库,返回空数据,但是List中显示有一个数据,点开以后显示  All elements are null ObjectUtils.isEmpty 和 List.isEmpty判断都失败,后续会 ...