Java异常相关
- 常见的Java异常类
- 异常 Exception
- 程序中的不正常情况 就视作异常
- Java语言提供了一套的完整的异常处理机制
- Java中的异常以异常类的方式存在
- 在Java程序中 会将异常类实例化为对象后抛出异常
- 错误 Error
- 当错误发生时 JVM只能终止 Error无法被异常机制处理
- 异常分类
- 编译时异常 Exception及其直接子类
- 需要在编译阶段处理
- 通常比较容易发生
- 运行时异常 RuntimeException及其子类
- 不需要编译阶段时间处理
- 发生的机率较小 一般不会处理
- 对于编译时异常和运行时异常 都会发生在运行阶段中
- 编译时异常 Exception及其直接子类
异常的处理方式
- 对于Java中的异常处理 有两种处理方式
- 直接抛出 使用
throw
语法- 将异常交给上层程序去处理
- 使用
try...catch
进行异常捕捉- 捕捉异常对其进行处理
- 直接抛出 使用
- 如果上抛到main方法 这是再不处理 还是选择抛出 会抛出到
JVM
JVM
接收到异常 只好终止程序的运行
使用 throw 进行抛异常
throw new Exception();
- 在需要抛出异常的位置 直接使用 throw 来抛出异常
- 当在方法中抛出异常时
- 可以选择在此处使用 try…catch 处理异常
- 需要在方法上指明抛出何种异常 使用 throws 抛出异常类型(可以抛出其父类)
使用 try catch 处理异常
- 完整结构
try {...} catch (Exception e) {...} finally {...}
- try 代码块
- 在 try 代码块中定义可能会出现异常的代码片段
- catch
- 用于捕捉异常
- catch 代码块可以存在多个 用于对异常进行精确处理
- catch 处理的异常从小到大(从子到父)
- 在JDK后 支持在一个 catch 中捕捉多个异常
- finally
- finally 代码块 用于执行一些必须执行的代码(无论是否发生异常) 通常用于资源释放
在 try 中存在 return 时
- 对于Java中的方法 return 一定时最后执行的代码
- 对于finally代码块 finally也必定会执行
- 当执行到 return 时 JVM会将 return 该行的语句结果保留(计算会变为值)
- 例如 try 中存在 return i++
- 会先保留一个 return i的字面值 (i当时的值) 而后才会执行 i++ 操作
- 然后执行 finally 中的代码
- 当执行 finally 结束 Java程序会执行那条保留的return语句
- 如果finally中也存在 return语句 这时候return语句会顶替原来的return语句
- 例如 try 中存在 return i++
异常处理的规则
- 重写方法时 抛出更少的异常 或者抛出父类异常
- 对于异常处理 主要关系编译时异常 运行时异常按照需求处理即可
Exception类
- 是Java中编译时异常的基类
- 需要使用自定义异常时需要继承Exception类
Exception常用方法
- String getMessage()
- 用于获取构造异常时传入的简要信息
- void printStackTrace()
- 用于在控制台输出出现异常的堆栈信息
- 该方法异步输出 所以输出时的位置可能不太确定
- 开发中常用于定位出错位置
使用自定义异常
- 编写自己的异常类 继承 Exception / RuntimeException 类
- 提供一个无参构造方法和一个带有String类型的构造方法(用于传入异常信息)
- 当继承 Exception 时 就是编译时异常
- 当继承 RuntimeException 时 就是运行时异常