Java SE——12.异常(≠错误)《干货笔记》

目录

异常概念与体系结构

异常概念

算数异常

数组越界异常

空指针异常

异常体系结构

异常的分类

编译时异常

运行时异常

异常的处理

防御式编程

事前防御型YBYL

事后认错型EAFP

异常的抛出

代码示例:【需求】:实现一个获取数组中任意位置元素的方法

异常的捕获

throws异常声明

代码示例:需求:加载指定的配置文件config.ini

[1. throws必须跟在方法的参数列表之后](#1. throws必须跟在方法的参数列表之后)

[2. 声明的异常必须是 Exception 或者 Exception 的子类](#2. 声明的异常必须是 Exception 或者 Exception 的子类)

[3. throws抛出的多个异常具有父子关系,直接声明父类](#3. throws抛出的多个异常具有父子关系,直接声明父类)

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

try-catch捕获并处理

代码示例:需求:读取配置文件,如果配置文件名字不是指定名字,抛出异常,调用者进行异常处理

finally

[既然 finally 和 try-catch-finally 后的代码都会执行,那为什么还要有finally呢?](#既然 finally 和 try-catch-finally 后的代码都会执行,那为什么还要有finally呢?)

finally中代码一定会执行,finally中资源清理的扫尾工作:

面试题

异常的处理流程

自定义异常

代码示例:自定义异常前

代码示例:自定义异常后


程序执行过程中发生的不正常行为称为异常

异常概念与体系结构

异常概念

算数异常

数组越界异常

空指针异常

异常体系结构

  1. Throwable:异常体系的顶层类(=Error + Exception)

  2. Error:Java虚拟机无法解决的严重问题:JVM的内部错误、资源耗尽等 ​典例:StackOverflowError(栈溢出错误)和OutOfMemoryError(堆溢出错误)

  3. 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将错误信息告知调用者

  1. throw必须写在方法体内部

  2. 抛出的对象必须是Exception 或者 Exception 的子类对象

  3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类, 则不用处理,直接交给JVM来处理

  4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译

  5. 异常一旦抛出,其后的代码就不会执行

代码示例:【需求】:实现一个获取数组中任意位置元素的方法

异常的捕获

throws异常声明

位置:方法声明时参数列表之后 时机:方法中抛出编译时异常,用户不想处理 即当前方法不处理异常,提醒方法的调用者处理异常 注👇

代码示例:需求:加载指定的配置文件config.ini
1. throws必须跟在方法的参数列表之后
2. 声明的异常必须是 Exception 或者 Exception 的子类
3. throws抛出的多个异常具有父子关系,直接声明父类
4. 调用声明抛出异常的方法时,调用者处理该异常,或者继续用throws抛出

try-catch捕获并处理

使用原因:throws对异常并没有真正处理,而是将其告诉调用者,由调用者处理 ​若想真正要对异常进行处理,就需要try-catch 注👇

代码示例:需求:读取配置文件,如果配置文件名字不是指定名字,抛出异常,调用者进行异常处理
  1. try块内抛出异常位置之后的代码将不会被执行
  2. 抛出异常与catch不匹配时,异常不被成功捕获,不会被处理,会继续往外抛,直到JVM收到后中断程序----异常是按照类型来捕获的
  1. try中抛出多种异常,必须多次捕获
  1. 可以通过一个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是非受查异常/运行时异常

  1. 自定义异常类,然后继承自Exception 或者 RunTimeException

  2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因

代码示例:自定义异常前

代码示例:自定义异常后

注👇

相关推荐
Data_agent2 小时前
1688获得1688店铺所有商品API,python请求示例
java·开发语言·python
一晌小贪欢2 小时前
【Python办公】-图片批量添加文字水印(附代码)
开发语言·python·图片水印·python水印·python添加水印·图片添加水印
why1512 小时前
面经整理——算法
java·数据结构·算法
Yeats_Liao2 小时前
CANN Samples(十三):Ascend C 算子开发入门
c语言·开发语言
越来越无动于衷2 小时前
Java 实现 WebService(SOAP)联网调用:从原理到实战
java·开发语言
静水楼台x2 小时前
Java之String系列--intern方法的作用及原理
java·spring
专注于大数据技术栈2 小时前
java学习--枚举(Enum)
java·学习
愤怒的代码2 小时前
Java 面试 100 题深度解析 · 专栏总览与大纲
java·面试
银迢迢2 小时前
idea控制台中文乱码采用好几种方法一直解决不了
java·ide·intellij-idea