Java异常处理----思维导图
下载地址: https://download.csdn.net/download/q863672107/20016445
以下是自动转换的MakeDown文本
异常处理
异常处理机制
try-catch-finally
体会一 :
使用 try -catch-finally 处理编译时异常, 使得程序在编译时不再报错, 但运行时仍可能报错。相当于我们使用try-catch-finally将有个编译时可能出现的异常, 延迟到运行时出现。
体会二 :
开发中, 由于运行时异常比较常见, 我们也不会针对运行时异常编写 try-catch-finally 。
针对编译时异常, 我们说一定要考虑异常的处理。
功能/注意点
-
try
-
- 将编译时异常包装后放到运行阶段再处理
-
- try块中声明的变量, 在外部不能调用
(外部声明, 内部赋值)
- try块中声明的变量, 在外部不能调用
-
-
catch
-
catch块中对异常的处理方法
-
String getMessage()
- 返回异常信息
-
void printStackTrace()
- 打印异常出现的堆栈信息
-
-
多个catch的顺序关系
- 对父类异常的catch必须声明在子类的后面,否则编译错误
-
-
finally
-
确保JVM不能自动回收资源的正常释放
实现Closeable接口的类- 数据库连接
- 输入输出流
- Socket等资源
-
try-with-resources
JDK9新特性
-
执行顺序
-
try
- try块中将可能出现异常的代码包装起来, 一旦出现异常, 就会生成一个对应的异常类对象, 根据此对象的类型转到catch中进行匹配
- try块中出现异常,try 块中异常语句后面的语句就不会执行
-
catch
- catch到异常并处理后, 然后退出try-catch结构, catch后面的语句正常执行。
- catch如果未能捕获异常, 异常自动抛出给调用者。
-
finally
-
finally中的语句一定会被执行
- 会在throw或者return前面执行
-
catch没有捕获异常, 或者catch中出现异常, finally也会执行
-
try/catch中有return, 会将值暂存,然后执行finally语句,再执行return返回try/catch语句中的暂存值。(注意引用类型只是暂存地址值)
-
当try/catch与finally语句中均有return语句,会提前return, 忽略try/catch中return。
-
异常处理机制 throws
“throws+异常类型” 写在方法的声明处, 声明方法执行时可能抛出的异常, 异常代码后续的代码不会被执行。
体会 : try-catch-finally 真正的将异常捕获并处理了
throws 的方式只是将异常抛给了方法的调用者, 并没有真正将异常处理掉。
手动生成并抛出异常 throw
(包含)编译时异常
throw Exception
- 需要在编译期处理(try-catch或者throws)
运行时异常
throw RuntimeException
用户自定义异常类
(自定义异常类名)
继承现有的异常结构
-
继承Exception
- 包含编译时异常, 编译时必须处理
-
继承RuntimeExceptiom
- 运行时异常, 可以不显式处理
实现Serializable接口
private static final long serialVersionUID
- 用来标识类版本, 序列化, 版本控制
无参构造
有参构造(String msg)
- super(msg)
异常概述/体系结构
(常见异常类)
Errror
Java虚拟机无法解决的严重问题,
如: JVM系统内部错误, 资源耗尽等情况。
一般不编写针对性的代码进行处理。–>修改错误代码
- 栈溢出SOF
StackOverflowError - 堆溢出OOM
OutOfMemoryError - …
Exception
因编程错误或偶然的外在因素导致的一般问题, 可以使用针对性的代码进行处理。
捕获错误最理想的是在编译期间, 但有的错误只有在运行时才会出现, 比如除数为0, 数组下标越界等。
分类: 编译时异常, 运行时异常
Exception类 都继承了 java.lang.Throwable类
-
编译时异常
checked受检异常-
- CloneNotSupportedException
-
ClassNotFoundException
-
IOException
- FileNotFoundException
- EOFException
- …
-
-
运行时异常
unchecked非受检异常-
RuntimeException
-
NullPointerException
-
IndexOutOfBoundsException
- ArrayIndexOutOfBoundsException
- StringIndexOutOfBoundsException
-
ClassCastException
-
NumberFormatException
-
InputMismatchException
-
ArithmeticException
-
…
-
-
throw和throws的区别
throw是生成异常的一种方式, throws是处理异常的一种方式
throws写在方法的声明处, 表示该方法可能抛出某个类型的异常对象
throw写在方法体内, 表示手动生成一个异常类型对象并抛出
如何选择处理方式
如果父类中重写的方法没有throws异常, 则子类重写的方法也不能thows异常, 只能try-catch
执行的方法中, 先后调用其他方法, 这几个方法是递进关系执行的, 建议throws后在外部处理
(内部try-catch可能就产生无意义的调用)