2026-10-18 06:08:43
Java异常是程序运行时可能出现的错误或意外情况的机制,掌握异常处理对程序员至关重要。以下从异常架构、处理流程、类型选择、常见面试题及最佳实践等方面进行总结。
一、Java异常架构与异常关键字Error:表示系统级错误,由JVM抛出(如OutOfMemoryError、StackOverflowError),程序无法捕获处理,通常需通过优化代码或调整JVM参数解决。
Exception:程序可处理的异常,分为检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)。
检查型异常:继承自Exception(非RuntimeException子类),如IOException、SQLException,编译时强制要求处理(try-catch或throws声明)。
非检查型异常:继承自RuntimeException,如NullPointerException、IllegalArgumentException,通常由代码逻辑错误引发,编译时不强制处理。
try:包裹可能抛出异常的代码块。
catch:捕获并处理特定类型的异常。
finally:无论是否发生异常,都会执行的代码块(常用于释放资源)。
throw:主动抛出异常对象。
throws:在方法签名中声明可能抛出的异常类型。
若找到匹配的catch块,执行其中的逻辑,然后跳过finally块(如有)继续执行后续代码。
若未找到匹配的catch块,且方法未声明throws,则异常向上传播至调用方;若传播至main方法仍未处理,程序终止并打印堆栈信息。
示例代码:
try { FileInputStream file = new FileInputStream("test.txt"); // 可能抛出IOException} catch (FileNotFoundException e) { System.out.println("文件未找到:" + e.getMessage());} catch (IOException e) { System.out.println("IO错误:" + e.getMessage());} finally { System.out.println("资源释放逻辑(如有)");}三、如何选择异常类型Error是系统级错误,程序无法处理;Exception是程序可处理的异常。
throw用于主动抛出异常对象;throws用于方法签名中声明可能抛出的异常类型。
除非调用System.exit()或JVM崩溃,否则finally一定会执行。
使用Optional类、显式判空(if (obj != null))、使用@NonNull注解(如Lombok)等。
当业务逻辑需要区分不同类型的错误时(如用户余额不足、订单已存在等)。
总结:Java异常处理需结合业务场景选择合适的异常类型,遵循“谁调用谁处理”的原则,通过最佳实践提升代码健壮性和可维护性。理解异常架构、处理流程及面试常见问题,能帮助小白快速掌握核心知识点。