【Java回顾】Day4 异常机制
异常机制
- 识别及响应错误,使程序中异常处理代码和正常业务代码分离。
异常层次
Java异常处理
- 异常是程序中的一些错误,但并不是所有的错误都是异常。
- 异常发生的原因|用户、程序、物理错误
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
三种异常
- 检查性异常,用户错误或问题引起的异常,异常在编译时强制要求程序员处理。
-
try{ //可能会抛出异常的代码 }catch(IOException e){ //处理异常的代码 }
-
-
public void readFile() throws IOException{ //可能会抛出IOException }
- 运行时异常 在编译时不强制要求处理,由程序中的错误引起的,例如NullPointerExcepton、ArrayIndexOut、OfBoundsException等
-
try{ //可能会抛出异常的代码 }catch(NullPointerException e){ //处理异常的代码 }
-
- 错误:错误不是异常,而是脱离程序员控制的问题,错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,他们在编译也检查不到的。
关键字和类【支持异常处理】
- try 包裹可能会抛出异常的代码块。
- catch 捕获异常并处理异常的代码块。
- finally 包含无论是否发生异常都需要执行的代码块
- throw 手动抛出异常
- throws 在方法声明中指定方法可能抛出的异常。
- Exception 所以异常类的父类,提供一些方法来获取异常信息,如getMessage() printStackTrace()等。
异常的捕获
- try-catch
- try-catch-finally
- try-finally
- try-with-resource
Exception类的层次
- 从java.lang.Exception类继承的子类。
- Error 用来指示运行时环境发生的错误。JAVA程序中,通常不捕获错误。
JAVA内置异常类
略
JAVA异常方法
略,有需要就查表
捕获异常
- try和catch关键字可以捕获异常,称为保护代码
-
try{ //程序代码 }catch(ExceptionName e1) { //catch块 }
多重捕获块 1个try多个catch
- 一个try代码块后面跟随多个catch代码块的情况,匹配不同的错误类型
-
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型3 异常的变量名3){ // 程序代码 }
throws/throw关键字
- throw 在代码中抛出异常
- throws 在方法声明中指定该方法可能抛出的异常。当方法内部抛出指定类型的异常时,会处理异常。
- 一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
finally关键字
- 无论是否发生异常,finally代码块中的代码总会被执行。在finally代码块中,可以运行清理类型等收尾善后性质的语句。
-
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 }
- catch不能独立于try存在,try也不能独立使用。
try-with-resources
- 自动管理资源,确保资源在使用后能够及时关闭,避免资源泄露。
- 自动关闭在try块中声明的资源,无需显式地在finally块中关闭。
-
try (resource declaration) { // 使用的资源 } catch (ExceptionType e1) { // 异常块 }
声明自定义异常
- 必须是Throwable的子类
- 检查性异常类,Exception类
- 运行时异常类,RuntimeException类
- class MyException extends Exception{
}
通用异常
- JVM(Java虚拟机)异常:JVM抛出的异常或错误
- 程序级异常:由程序或API程序抛出的异常
八股文
- 异常执行的顺序
- try无异常:执行try,跳过catch,执行finally语句块和其后的语句
- try有异常,catch没有处理此异常:抛给JVM处理,finally执行,finally之后的不执行
- try异常,catch异常,按顺序,try-catch-finally-finally之后的语句
- 何时finally不会执行
- 如果try之前就return
- System.exit(0) 是JVM提供的强制关闭虚拟机
- finally中不要使用return的两种情况
- catch捕获到异常,并throw给上级处理,但finally中return了,那么上级无法捕获到异常
- 在finally里的return之前执行了其他return,最终的返回值还是finally中的return
- 注意事项
- 不要在finally中使用return
- 包装异常时不要抛弃原始的异常
- 不要使用异常控制程序的流程
- 在finally块中清理资源或者使用try-with-resource语句
- 优先捕获最具体的异常
- 不要捕获Throwable类