第十一章 异常处理

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. Kafka入门学习

    什么是 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区.多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系 ...

  2. 《SQL与数据库基础》05. SQL-DCL

    目录 DCL 用户管理 权限控制 本文以 MySQL 为例 DCL 用户管理 查询有哪些用户: 1. USE mysql; SELECT * FROM user; 2. SELECT * FROM m ...

  3. 如何利用电商API接口来获取商品数据

    要利用电商API接口来获取商品数据,我们可以按照以下步骤实现: 确定电商平台和API接口 不同的电商平台提供不同的API接口,因此我们需要确定我们要获取商品数据的电商平台,并选择相应的API接口进行调 ...

  4. Codeforces 1463D Pairs

    题意 对于数字\(1\)~\(2n\),可以构造出\(n\)个二元组,对于\(n\)个二元组,选择一个数组\(x\),留下\(x\)个二元组的最小值,留下\(n-x\)个二元组的最大值,其构成了一个集 ...

  5. Mysql基础篇-查询、函数、多表、事务

    1. 基础篇 1.1 mysql用户和权限管理 查询用户 USER mysql; SELECT * FROM user; 创建用户 CREATE USER '用户名'@'主机名' IDENTIFIED ...

  6. 「codeforces - 1344D」Résumé Review

    link. 有点狗,但还算个好题. 设定 \(f_i(x)=a_ix-x^3\),\(\Delta_i(x)=f_i(x)-f_i(x-1)\),可以洞察到 \(\Delta_i(x)\) 在正自然数 ...

  7. 「tricks」平凡二分幻术

    其实这个的标题叫 平凡线段树上二分幻术,因为这是一个民科在乱叫. 如标题所言,这个东西确实非常 trivial.碍于网络上没有一个成体系的文章供参考就只能自己来炒炒冷饭. 如果出了什么 bug 就当个 ...

  8. ChatGPT API Transition Guide

    ChatGPT API Transition Guide How to get started Written by Joshua J.. Updated over a week ago Prompt ...

  9. Cloud Bursting解决方案,Serverless容器降本增效极致体验

    本文分享自华为云社区<DTSE Tech Talk | 第42期:Cloud Bursting解决方案,Serverless容器降本增效极致体验>,作者:华为云社区精选. 线下IDC自建K ...

  10. DHorse v1.4.2 发布,基于 k8s 的发布平台

    版本说明 优化特性 在集群列表增加集群版本: 修改Jvm的GC指标名: 解决问题 解决shell脚本换行符的问题: 解决部署历史列表页,环境名展示错误的问题: 解决指标收集功能的异常: 升级指南 升级 ...