目录
[1. throws必须跟在方法的参数列表之后](#1. throws必须跟在方法的参数列表之后)
[2. 声明的异常必须是 Exception 或者 Exception 的子类](#2. 声明的异常必须是 Exception 或者 Exception 的子类)
[3. throws抛出的多个异常具有父子关系,直接声明父类](#3. throws抛出的多个异常具有父子关系,直接声明父类)
[4. 调用声明抛出异常的方法时,调用者处理该异常,或者继续用throws抛出](#4. 调用声明抛出异常的方法时,调用者处理该异常,或者继续用throws抛出)
代码示例:需求:读取配置文件,如果配置文件名字不是指定名字,抛出异常,调用者进行异常处理
[既然 finally 和 try-catch-finally 后的代码都会执行,那为什么还要有finally呢?](#既然 finally 和 try-catch-finally 后的代码都会执行,那为什么还要有finally呢?)
finally中代码一定会执行,finally中资源清理的扫尾工作:
程序执行过程中发生的不正常行为称为异常
异常概念与体系结构
异常概念
算数异常

数组越界异常

空指针异常

异常体系结构

Throwable:异常体系的顶层类(=Error + Exception)
Error:Java虚拟机无法解决的严重问题:JVM的内部错误、资源耗尽等 典例:StackOverflowError(栈溢出错误)和OutOfMemoryError(堆溢出错误)
Exception:异常产生后程序员可用代码处理,使程序继续执行(例如感冒发烧)
异常的分类
编译时异常

程序编译期间发生的异常(受检查异常(Checked Exception))
运行时异常
程序执行期间发生的异常(非受检查异常(Unchecked Exception))
RunTimeException以及其子类对应的异常,都称为运行时异常
异常的处理
核心思想:EAFP(事后认错)
主要的5个关键字:throw、try、catch、final、throws
防御式编程
事前防御型YBYL

Look Before You Leap. 操作之前做充分检查
缺陷:正常和错误代码混在一起, 代码整体显的比较混乱
事后认错型EAFP

It's Easier to Ask Forgiveness than Permission. "
事后获取原谅比事前获取许可更容易".
也就是先操作, 遇到问题再处理
优势:正常和错误代码分离开, 程序员更关注正常流程,代码更清晰,容易理解代码
异常的抛出

程序员手动抛出:借助throw将错误信息告知调用者
throw必须写在方法体内部
抛出的对象必须是Exception 或者 Exception 的子类对象
如果抛出的是 RunTimeException 或者 RunTimeException 的子类, 则不用处理,直接交给JVM来处理
如果抛出的是编译时异常,用户必须处理,否则无法通过编译
异常一旦抛出,其后的代码就不会执行
代码示例:【需求】:实现一个获取数组中任意位置元素的方法

异常的捕获
throws异常声明

位置:方法声明时参数列表之后 时机:方法中抛出编译时异常,用户不想处理 即当前方法不处理异常,提醒方法的调用者处理异常 注👇
代码示例:需求:加载指定的配置文件config.ini

1. throws必须跟在方法的参数列表之后
2. 声明的异常必须是 Exception 或者 Exception 的子类
3. throws抛出的多个异常具有父子关系,直接声明父类

4. 调用声明抛出异常的方法时,调用者处理该异常,或者继续用throws抛出

try-catch捕获并处理

使用原因:throws对异常并没有真正处理,而是将其告诉调用者,由调用者处理 若想真正要对异常进行处理,就需要try-catch 注👇
代码示例:需求:读取配置文件,如果配置文件名字不是指定名字,抛出异常,调用者进行异常处理

- try块内抛出异常位置之后的代码将不会被执行
- 抛出异常与catch不匹配时,异常不被成功捕获,不会被处理,会继续往外抛,直到JVM收到后中断程序----异常是按照类型来捕获的

- try中抛出多种异常,必须多次捕获


- 可以通过一个catch捕获所有的异常,即多个异常,一次捕获(不推荐)

finally

作用:(扫尾工作,一定能执行到)关闭程序中一定打开的资源
既然 finally 和 try-catch-finally 后的代码都会执行,那为什么还要有finally呢?

上述程序,如果正常输入,成功接收输入后程序就返回了,try-catch-finally之后的代码根本就没有执行,即输入流就没有被释放,造成资源泄漏
finally中代码一定会执行,finally中资源清理的扫尾工作:

inally 执行时机:在方法返回之前
(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally).
但是如果finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return.
一般我们不建议在 finally 中写 return (被编译器当做一个警告)
面试题

异常的处理流程

交给JVM就程序终止了
往上找:谁调用这方法谁处理
自定义异常
A class extends Exception------>A class是受查异常/编译时异常
B class extends RuntimeException------>B class是非受查异常/运行时异常
自定义异常类,然后继承自Exception 或者 RunTimeException
实现一个带有String类型参数的构造方法,参数含义:出现异常的原因
代码示例:自定义异常前

代码示例:自定义异常后

注👇
