java异常体系以throwable为根,error表示jvm无法恢复的严重错误(如outofmemoryerror),不应捕获;exception分为受检异常(如ioexception,编译强制处理)和运行时异常(如nullpointerexception,应通过逻辑修正避免)。

Java异常处理面试题核心不在背答案,而在理解机制背后的逻辑和实际取舍。重点是说清楚“为什么这么设计”,而不是只罗列分类或语法。
抓住异常体系的根与分支
从Throwable开始讲起,它不是摆设,而是整个异常机制的基石。Error和Exception的分界线很清晰:前者是JVM自己扛不住的问题(比如OutOfMemoryError、StackOverflowError),程序不该、也不能去catch;后者才是开发者要面对的“可控异常”。关键点在于——Exception又必须拆成两块讲清:受检异常(IOException、SQLException)编译器强制你处理,因为它们代表外部不确定性(文件可能不存在、网络可能断开);运行时异常(NullPointerException、ArrayIndexOutOfBoundsException)是代码逻辑缺陷,编译器不拦你,但你应该用防御性编程提前规避,而不是靠catch兜底。
说透try-catch-finally的执行逻辑
面试官常问“finally一定执行吗”,答案不是简单的是或否。要说明:只要JVM没挂(比如没遇到System.exit()、断电、OutOfMemoryError),try或catch里哪怕有return,finally也一定会在方法返回前执行。但要注意两个例外:一是try/catch里执行了System.exit(),二是JVM直接崩溃。另外,多个catch的顺序不能乱——子类异常必须写在父类前面,否则编译不通过。比如NullPointerException必须放在Exception前面,否则后者的catch永远捕不到。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
对比throws和throw的实际用途
throws是声明契约,告诉调用方“我这里可能出问题,你得接住”;throw是主动触发,常用于校验失败时抛出自定义异常。重点要区分:受检异常必须用throws声明或try-catch处理,而运行时异常可以只用throw抛出,不用声明。例如参数校验不通过,直接throw new IllegalArgumentException("id不能为空"),干净利落,不用在方法签名上堆一堆throws。
用try-with-resources替代手动close
JDK7引入的这个语法不是炫技,而是解决资源泄漏的硬需求。以前写FileReader必须在finally里判空再close,容易漏、容易错。现在直接写try (FileInputStream fis = new FileInputStream("a.txt")) { ... },JVM保证fis.close()自动调用,哪怕中间抛异常也不怕。面试时如果被问“怎么释放IO资源”,优先答这个,再补充一句“它要求资源类实现AutoCloseable接口”就更到位。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










