1️⃣ 一、什么是异常
🚋 1、简介
异常是指程序中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。
异常发生在程序运行期间,它影响了正常的程序执行流程。
🎈 2、举例
类别 | 说明 |
---|---|
检查型异常 | 程序员无法预见,如:用户错误或问题引起的异常、打开一个不存在的文件,不能在女编译时忽略 |
运行时异常 | 程序员可以避免,可以在编译时忽略 |
错误 | 错误不是异常,是脱离程序员控制的问题,编译时检查不到,如:栈溢出错误 |
🌈 3、常见异常
举例 | 说明 |
---|---|
RuntimeException | 运行时异常 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 空指针异常 |
ArithmeticException | 算术异常 |
MissingResourceException | 丢失资源 |
ClassNotFoundException | 找不到类 |
📌4、Error和Exception的区别
Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常是,Java虚拟机(JVM)一般会选择终止线程;
Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
2️⃣ 二、捕获和抛出异常
🚋 1、捕获异常
快捷键:ctrl + alt + T
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 0;
int[] c = {1, 2, 3, 4};
try {//try监控区域
// System.out.println(a/b);
System.out.println(c[4]);
} catch (ArithmeticException e) {//想要捕获的异常类型(从小到大)
System.out.println("算术异常");
} catch (ArrayIndexOutOfBoundsException e) {//想要捕获的异常类型(从小到大)
System.out.println("数组下标越界");
} catch (RuntimeException e) {//想要捕获的异常类型(从小到大)
System.out.println("运行时异常");
} finally {
System.out.println("程序错误,请修改!");//处理善后工作,如:关闭IO资源
}
}
}
🎈 2、抛出异常
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 0;
try {
System.out.println(new Main().f(a,b));
} catch (ArithmeticException e) {//方法上主动抛出后,这里会自动识别
throw new RuntimeException(e);
}
}
//假设这个方法处理不了这个异常,就要在方法上抛出异常
public int f(int a, int b) throws ArithmeticException{
if (b == 0) {
throw new ArithmeticException();//主动抛出异常,一般用在方法中
}else{
return a / b;
}
}
}
3️⃣ 三、自定义异常
🚋 1、大体步骤
用户自定义异常类,需要继承Exception类
,使用 extends Exception
- 创建自定义异常类
- 在方法中通过throw关键字抛出异常对象
- 如果在当前抛出异常的方法中处理异常,可以通过try-catch语句捕获并处理;否则在方法的声明处通过throws关键字声明要抛出给方法调用者的异常,继续进行下一步操作
- 在出现异常方法的调用者中捕获并处理异常
🎈 2、举例
//继承 Exception 类-----自定义的异常类
public class MyException extends Exception {
//传递数字 大于10
private int detail;
public MyException(int a) {
this.detail = a;
}
//异常打印信息
@Override
public String toString() {
return "MyException{" +
detail +
'}';
}
}
class Test {
//可能会存在异常的方法
static void test(int a) throws MyException {
System.out.println("传递的参数为:" + a);
if (a > 10) {
throw new MyException(a);//抛出
}
System.out.println("OK");
}
public static void main(String[] args) {
try { //捕获
test(11);
} catch (MyException e) {
System.out.println("MyException => " + e);
}
}
}
4️⃣ 四、经验总结
- 处理运行时异常时,采用逻辑去合理规避同时辅助 try - catch 处理
- 在多重 catch 块后面,可以加一个 较大范围的 catch (Exception) 来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上 try - catch ,处理潜在的异常
- 尽量去处理异常,切忌只是简单地调用 printStackTrace() 去打印输出
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加 finally 语句块去释放占用的资源(如:IO操作)
说在最后📝:
✍创作不易,如果觉得文章写得还可以的话,就不要吝啬你的 👍 啦~ ✍