一.Error和Exception的区别?
在Java中异常体系主要基于Throwable及其子类,Throwable主要有两个子类 Error 和 Exception
Error:表示运行环境的错误,错误是程序无法处理的严重问题,如虚拟机错误、动态连接库失效等。
Exception:表示程序本身可以处理的情况,分为两大类
受检异常(编译时异常): 这种异常在编译时就必须处理(try-atch huo throws) 如:IOException、SQLException
非受检异常(运行时异常) : 在运行时才抛出,编译不强制处理 如:NullPointerException、ArrayIndexOutOfBoundsException
1.1 常见的Error 和 Exception有哪些?
Error: StackOverflowError 栈溢出:无限递归、方法调用层级太深
OutOfMemoryError (OOM) 内存溢出:堆内存不够
NoClassDefFoundError 运行时找不到类(编译有,运行没)
NoSuchMethodError 找不到方法(版本冲突最常见)
LinkageError 类加载 / 链接失败
VirtualMachineError 虚拟机本身异常
Exception:
NullPointerException (NPE) 空指针(最最最常见)
IndexOutOfBoundsException 下标越界(数组、集合)
IllegalArgumentException 参数不合法
IllegalStateException 状态不合法
ClassCastException 类型转换异常
ArithmeticException 算术异常(除 0)
ConcurrentModificationException 集合遍历时修改
UnsupportedOperationException 不支持的操作
FileNotFoundException 文件找不到
SQLException 数据库异常
ClassNotFoundException 找不到类(和 NoClassDefFoundError 不同)
InterruptedException 线程中断异常
ParseException 格式化解析异常(日期、数字)
二.throw 和 throws 的区别是什么?
举例: throw:
public void checkAge(int age) {
if (age < 0) {
// 手动抛出 一个 异常对象
throw new IllegalArgumentException("年龄不能为负数");
}
}
throws:
// 方法声明:可能抛出 IOException 和 SQLException
public void readFile() throws IOException, SQLException {
// 方法内部可能出现异常
FileReader fr = new FileReader("test.txt");
}
三.try-catch-finally的执行顺序
正常执行顺序(无异常) 先执行 try 代码块 try 执行完 -> 执行 finally 代码块 finally 执行完 -> 方法继续往后走 catch 不执行
出现异常的执行顺序 执行 try ,遇到异常立刻停止 try 后续diamagnetic 匹配对应catch 块并执行 catch 执行完 -> 执行 fianlly finally 执行完 -> 方法继续
3.1 finally中的代码一定会被执行吗?
答案是不一定
try {
System.exit(0); // 退出虚拟机
} finally {
System.out.println("我不会执行!");
}
线程被强制杀死 在执行 finally 之前,线程被stop或操作系统杀死,finally 不执行
死循环
try {
while(true) { } // 死循环
} finally {
System.out.println("我永远等不到!");
}
3.2 finally 块中如果有 return 语句,会发生什么?
结论:finally 里面写return,会直接覆盖太try/catch 里的return,并且”吃掉“异常 覆盖
public static int test() {
try {
return 10;
} finally {
return 20;
}
}
吃掉异常
public static int test() {
try {
// 抛出异常
throw new RuntimeException("出异常了");
} finally {
return 100;
}
}
四.NoClassDefFoundError 和 ClassNotFoundException 的区别?
ClassNotFoundExceptionException(异常):加载类时,找不到类文件→ 主动去加载,结果没找到
NoClassDefFoundErrorError(错误):类存在,但加载失败了→ 编译时有,运行时找不到 / 加载失败




