【自学java】异常处理简介
第四章 异常处理
学习 java 、刷算法题时,很少有人会在乎异常处理, 要不 try catch 、 要不就 throw 。但在做项目时候, 异常处理混乱会导致程序可维护性降低。异常本身也是程序的一部分。
第一节 简介
4.1.1 分类
Throwable 接口又分为“异常”、“错误”。异常是程序可以自己处理的, 错误一般是程序无法处理。
2020-07-22_210628.png一旦捕获了异常,该段程序进入异常处理流程,不会在执行。try 后的代码还是会继续执行的。
public static void main(String[] args) {
try {
System.out.println(13/0);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("会往下执行码?");
}
out
会往下执行码?
java.lang.ArithmeticException: / by zero
at com.awork.common.utils.Test.main(Test.java:6)
4.1.2 检测性异常
异常的另一种分类 : 受检异常 checked、 非受检异常 unchecked。
区别: 在编译的过程中, 非受检异常不会提示,只有当程序运行到异常位置触发异常, 程序寻找异常是否被处理。
非受检异常: RuntimeException 、 Error
受检异常: IOException 、 SQL …
注:
jvm 认为受检异常是可修复的,在编译时会提出, 不会通过编译。诸如 RuntimeException 之类的非受检异常,可以通过编译。 但 jvm 认为程序本身有问题,应该本身捕获异常并处理,再重新运行程序。
第二节 异常与错误
4.2.1 区别
异常是程序可以自己处理的, 错误一般是程序无法处理。 异常处理是程序的一部分,处理过后程序依然可以继续执行流程 。 错误可能需要重新分配 jvm 资源,(如爆栈) 程序已经无法通过 try catch 处理了 。
第三节 异常的处理方式
4.3.1 处理
- 常规 try ... catch ... finally ...
public static void main(String[] args) {
try {
System.out.println(13/0);
}catch (Exception e){
e.printStackTrace();
} finally {
System.out.println("finally");
}
System.out.println("会往下执行码?");
}
out :
finally
java.lang.ArithmeticException: / by zero
会往下执行码?
可见 , 即使抓到异常, finally 代码块还是会执行 , 并且先于后续代码。
- throws
声明在方法中 ,表示方法可能会抛出异常,上层调用者需要捕获异常。
- throw
手动抛出异常 : throw new MyException(params);
4.3.2 自定义异常
便于对一类异常进行自定义分类, 遵循 java 封装原则。 便于捕获异常迅速定位。(比如, 是某类 service 出错)
继承 Exception , 重写构造方法 , 例如:
public class MyException extends Exception {
public MyException() {
super();
}
public MyException(String str) {
super(str);
}
}
4.3.3 获取异常信息的常用方法
-
方法1
e.printStackTrace();
-
方法2
StackTraceElement[] stackTrace = e.getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
String className = stackTraceElement.getClassName();
System.out.println(className);
}