第十一章 异常处理

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. Go 并发编程 - 并发安全(二)

    什么是并发安全 并发情况下,多个线程或协程会同时操作同一个资源,例如变量.数据结构.文件等.如果不保证并发安全,就可能导致数据竞争.脏读.脏写.死锁.活锁.饥饿等一系列并发问题,产生重大的安全隐患,比 ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (97)-- 算法导论9.3 3题

    三.用go语言,假设所有元素都是互异的,说明在最坏情况下,如何才能使快速排序的运行时间为O(nlgn). 文心一言: 快速排序是一种基于分治策略的排序算法,其平均时间复杂度为O(nlgn).在最坏情况 ...

  3. Mybatis-Plus 系列:简介和基本使用

    目录 一.简介 二.特性 三.基本使用 1.初始化数据库 2.初始化工程 3.精简 SpringBoot 相关日志 一.简介 官网:https://www.baomidou.com MyBatis-P ...

  4. EQ 均衡器

    EQ 的全称是 Equalizer,EQ 是 Equalizer 的前两个字母,中文名字叫做"均衡器".最早是用来提升电话信号在长距离的传输中损失的高频,由此得到一个各频带相对平衡 ...

  5. Python的23种设计模式

    文章目录 Python与设计模式--前言 一 什么是设计模式 二 为什么要有设计模式 三 有那些设计模式 创建类设计模式(5种) 结构类设计模式(7种) 行为类设计模式(11种) 四 设计模式与架构, ...

  6. 10 Myths About Introverts

    By Carl King [ Translations: Spanish| German | Dutch | Italian | Portuguese ] I wrote this list in l ...

  7. 报Bug的礼仪

    不要对1个程序员说:你的代码有Bug.他的第1反应是:1.你的环境有问题吧:2.傻逼你会用吗? 如果你委婉的说:你这个程序和预期的有点不1致,你看看是不是我的打开姿势有问题?他本能的会想:擦,是不是出 ...

  8. 记一次MySQL5初始化被kill的问题排查

    写在前面 由于测试环境JED申请比较繁琐,所以Eone提供了单机版Mysql供用户使用,近期Eone搭建Mysql5的时候发现莫名被kill了,容器规格是4C8G,磁盘30G 这不科学,之前都是可以的 ...

  9. ACL 与NAT

    ACL 概述 acl是由一系列permit或deny语句组成.有序规则的列表. ACL是一个匹配工具,能够对报文进行匹配和区分. 应用 匹配流量 在traffic-filter中备调用 在NAT中被调 ...

  10. 错误记录-FileStream访问被拒绝

    简介: 问题:因项目需要,软件需要读取授权文件中的密文与本机验证码做一定的逻辑比对,使用FileStream实现文件的读取,在本机调试没问题,但在其他同事电脑上有一些出现授权一直不通过的情况. --M ...