异常类分析
一、异常体系
两大类:错误 异常
错误:程序没有办法处理的错误:栈溢出
剩余叫异常 分两类 运行时异常/非受检异常(编译时不受检查):空指针,索引时下标越界
和非运行时异常/受检异常(编译时会检查出来):class文件未找到
二、异常处理方法
1.try-catch
try:
• 作用域:把“可能出异常的代码”放进花括号。
• 一旦异常抛出,try 块里 剩余代码立即中断,跳到 catch。
catch可以有多个
try {// 可能抛出异常的代码
} catch (异常类型1 变量1) {// 处理方案1
} catch (异常类型2 变量2) {// 处理方案2
} finally {// 无论是否出异常都会执行的代码
}
2.finally
无论是否出异常都会执行(除非 JVM 提前退出)
int[] a = new int[5];
// try catch finally
try {for (int i = 0; i < 10; i++) {a[i] = i;}int num = 0;int count = 10 / num;
} catch (ArrayIndexOutOfBoundsException e) {System.out.println(e);
} catch (ArithmeticException e) {System.out.println(e);
} finally {System.out.println("执行啦");
}
最后会有“执行啦”这句话输出
3.异常体系总览
Throwable
├─ Error(JVM 严重问题,程序不处理)
└─ Exception
├─ RuntimeException(运行时异常)
│ ├─ NullPointerException
│ ├─ ArrayIndexOutOfBoundsException
│ └─ ArithmeticException
└─ Checked Exception(检查时异常)
├─ IOException
└─ SQLException
4.异常关键字
throw 抛出异常
throws 声明在方法后边,跟的是类名,可以跟多个异常类,用逗号隔开,表示出现异常的一种可能性,并不是一定发生。
throw 声明在方法内,跟的是对象名,只能抛出一个异常,表示一定会发生的异常。
关键字/概念 | 出现位置 | 语法示例 | 作用/含义 | 是否一定执行 | 可跟多个 |
final | 变量 方法 类 | final int x=1; final void show(){} final class A{} | 禁止二次赋值 禁止重写 禁止继承 | — | — |
finally | 异常处理结构 | try{...}finally{...} | 无论是否抛异常 都会执行的代码块 | ✅ | — |
finalize() | Object 方法 | protected void finalize(){} | GC 回收对象前调用的 “临终清理”钩子 | ❌ | — |
throws | 方法签名 | void m() throws IOException | SQLException | 告诉调用者 去处理 | ❌ |
throw | 方法体内 | throw new RuntimeException ("xxx"); | 实际抛出一个异常对象 (一定会中断当前流程) | ✅ | ❌ |
Class.forName() | 任意位置 | Class.forName ("com.xxx.Cat") | 运行时动态加载类 并返回 Class 对象 | — | — |