Java异常体系精讲:一文吃透九大常见异常成因、场景与代码实战
目录
一、NullPointerException 空指针异常
二、ClassNotFoundException 类不存在异常
三、NumberFormatException 数字格式转换异常
四、IndexOutOfBoundsException 数组下标越界异常
五、ClassCastException 数据类型转换异常
六、FileNotFoundException 文件未找到异常
七、NoSuchMethodException 方法不存在异常
八、IOException IO 流异常
九、SocketException 网络套接字异常
十、九大异常面试极简总结(背诵版)
十一、文末小结
在 Java 开发和面试中,异常是日常开发出镜率最高的问题。线上 Bug、程序崩溃、接口报错,绝大部分都来自常见运行时异常与编译异常。
很多开发者只会报错排查,不知道异常成因、不会提前规避、分不清各类异常的适用场景。
本文整理面试与开发中9 大高频异常,逐类讲解定义、触发场景、错误代码、解决方案,从零彻底吃透 Java 常见异常体系。
一、NullPointerException 空指针异常
释义:最常见的运行时异常。当程序调用null 对象的方法或属性时,触发空指针异常。
触发场景:对象未初始化、接收 null 值、查询数据为空直接调用属性。
public class ExceptionDemo { public static void main(String[] args) { // 对象未初始化,默认null String str = null; // 空对象调用方法,触发空指针 str.length(); } }规避方案:使用前判空(if != null、Objects.nonNull)。
二、ClassNotFoundException 类不存在异常
释义:编译通过、运行时找不到指定类,属于检查型异常。
触发场景:Jar 包缺失、类路径错误、全类名写错、动态加载类不存在。
public class ExceptionDemo { public static void main(String[] args) throws ClassNotFoundException { // 错误类名,运行找不到类 Class.forName("com.test.NoSuchClass"); } }规避方案:检查依赖包、核对类全限定名、确保类可被加载。
三、NumberFormatException 数字格式转换异常
释义:字符串格式不合法,无法转为数字时抛出。
触发场景:空字符串、特殊字符、中文、小数点过多的字符串转数字。
public class ExceptionDemo { public static void main(String[] args) { // 非纯数字字符串,无法转换 String numStr = "123abc"; Integer.parseInt(numStr); } }规避方案:转换前正则校验格式、try-catch 捕获异常。
四、IndexOutOfBoundsException 数组下标越界异常
释义:访问数组/集合下标超出合法范围,下标小于0或大于等于数组长度。
触发场景:循环下标控制不当、硬编码下标、集合为空强行取值。
public class ExceptionDemo { public static void main(String[] args) { int[] arr = {10,20,30}; // 数组长度3,下标最大为2,访问3越界 System.out.println(arr[3]); } }规避方案:遍历使用 length 动态判断,禁止硬编码下标。
五、ClassCastException 数据类型转换异常
释义:强制类型转换时,父子类无继承关系、类型不匹配导致转换失败。
触发场景:向上转型没问题,向下强制转型类型不匹配。
public class ExceptionDemo { public static void main(String[] args) { Object obj = "测试字符串"; // 字符串无法强转为Integer,类型转换异常 Integer num = (Integer) obj; } }规避方案:转型前使用 instanceof 判断类型。
六、FileNotFoundException 文件未找到异常
释义:读取/写入文件时,文件路径错误、文件被删除、无访问权限。
触发场景:路径写错、资源文件丢失、相对路径错误。
import java.io.FileReader; public class ExceptionDemo { public static void main(String[] args) throws Exception { // 不存在的文件路径 FileReader reader = new FileReader("D:/noexist.txt"); } }规避方案:先判断文件是否存在、统一使用项目资源路径。
七、NoSuchMethodException 方法不存在异常
释义:通过反射调用方法时,找不到对应名称、参数列表的方法。
触发场景:方法名写错、参数类型不匹配、方法被私有化、版本更新方法删除。
public class ExceptionDemo { public static void main(String[] args) throws NoSuchMethodException { // 获取不存在的方法 Demo.class.getMethod("noSuchMethod"); } } class Demo{ public void test(){} }规避方案:核对方法名、参数列表、访问权限。
八、IOException IO 流异常
释义:文件读写、网络传输、流操作出现通用 IO 异常,是所有 IO 异常的父类。
触发场景:文件损坏、流关闭异常、网络中断、读写权限不足。
import java.io.FileInputStream; import java.io.IOException; public class ExceptionDemo { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("test.txt"); fis.read(); fis.close(); } }规避方案:IO 操作放入 try-catch,finally 关闭流资源。
九、SocketException 网络套接字异常
释义:网络通信异常,客户端与服务端连接中断、端口占用、连接超时、数据流断开。
触发场景:网络断开、服务端宕机、端口被占用、客户端强制关闭连接。
规避方案:网络操作增加重试机制、心跳检测、异常捕获重连。
十、九大异常面试极简总结(背诵版)
NullPointerException:空对象调用方法属性;
ClassNotFoundException:运行找不到指定类;
NumberFormatException:字符串转数字格式非法;
IndexOutOfBoundsException:数组集合下标越界;
ClassCastException:数据强制类型转换不匹配;
FileNotFoundException:文件路径错误或文件不存在;
NoSuchMethodException:反射找不到对应方法;
IOException:文件、流读写通用 IO 异常;
SocketException:网络通信连接异常。
十一、文末小结
以上九大异常是 Java 开发与面试中出现频率最高的异常类型。
掌握每种异常的触发场景、报错原因、规避方式,可以快速定位线上 Bug、减少低级错误、写出健壮稳定的代码,是后端工程师必备的基础功底。
