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掉(踢皮球)。
Head First Java学习:第十一章-异常处理的更多相关文章
- “全栈2019”Java多线程第二十一章:同步代码块产生死锁的例子
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十一章:线程优先级详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第二十一章:finally不被执行的情况
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java异常第十一章:重写方法时只能抛出父类异常子集
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java第一百一十一章:内部类可以被覆盖吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第八十一章:外部类能否访问嵌套接口里的成员?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第七十一章:外部类访问静态内部类成员详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第六十一章:如何实现接口?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第五十一章:继承与final关键字详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第三十一章:二维数组和多维数组详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- 如何获取和分析Java堆信息
引言 在Java应用程序的开发和维护过程中,了解和分析Java堆信息是一项重要的任务.本文将介绍如何获取Java堆信息的不同方法,并提供一些分析堆信息的实用技巧. 获取Java堆信息的方法 Java虚 ...
- Go语言中JSON的反序列化规则
Unmarshal 解析 func Unmarshal(data []byte, v any) error Unmarshal 解析 JSON 编码的数据,并将结果存储在 v 指向的值中.如果 v 为 ...
- 在微服务环境下,远程调用feign和异步线程存在请求数据丢失问题
一.无异步线程得情况下feign远程调用: 0.登录拦截器: @Component public class LoginUserInterceptor implements HandlerInterc ...
- PYQT5学习(13):QMidArea同时显示多个窗口,创建多个独立的窗口
QMidArea 参考文章:https://blog.csdn.net/jia666666/article/details/81670569 一种同时显示多个窗口的方法,创建多个独立的窗口,这些独立 ...
- 全网最详细Java-JVM
Java-JVM ①JVM概述 ❶基本介绍 JVM:全称 Java Virtual Machine,一个虚拟计算机,Java 程序的运行环境(Java二进制字节码的运行环境) 特点: Java 虚拟机 ...
- Solution -「HNOI 2010」城市建设
Description Link. 修改边权的动态 MST. Solution 讲清楚点. 修改边权的 MST,考虑对时间分治.设我们当前操作的操作区间是 \([l,r]\),直接暴力找 MST 是不 ...
- 【ASP.NET Core】在 Mini-API 中注入服务
经过版本更新,Mini API 的功能逐步完善,早期支持得不太好的 mini API 现在许多特性都可以用了,比如灰常重要的依赖注入. 咱们先来个相当简单的注入测试.来,定义一个服务类,为了偷懒,老周 ...
- PPT太大发不出去?教你三个PPT压缩方法,200M的PPT变15M
相信有很多小伙伴在工作的时候,都会制作不少的PPT,而我们也知道很多PPT在制作完成以后,体积就会变得非常大,在发送给别人的时候总是会受到限制,是有点难搞了. 别担心,今天小编将告诉大家三个简单的方法 ...
- 一场3天前的cf
啊 这次的cf其实水的(指前4题) 题面就不给了awaT1其实就是一个贪心,其实手模一下就好了.可以发现,先让小的那个变大,然后在后面一直让小的加上大的统计一下次数就是答案了.因为如果是这样算的话,两 ...
- MySQL的index merge(索引合并)导致数据库死锁分析与解决方案
背景 在DBS-集群列表-更多-连接查询-死锁中,看到9月22日有数据库死锁日志,后排查发现是因为mysql的优化-index merge(索引合并)导致数据库死锁. 定义 index merge(索 ...