java异常处理核心是主动拦截、分类应对、资源兜底:精准try包裹高风险操作,优先捕获子类异常并明确响应;运行时异常靠校验预防,检查型异常必须处理,error不捕获;用try-with-resources或finally保障资源释放;外层统一兜底并返回友好提示。

Java 处理异常防止程序崩溃,核心是主动拦截、分类应对、资源兜底,而不是等出错再补救。关键不在于“能不能捕获所有异常”,而在于“在哪儿捕获、捕什么、怎么响应”。
用 try-catch 包住高风险代码段
不是给整个 main 方法套一层大 try,而是精准包裹真正可能出问题的逻辑,比如读文件、解析数字、调用外部接口。-
try块里只放易失败的操作(如Integer.parseInt(input)、FileReader.open()) -
catch要具体,优先捕获子类异常(如NumberFormatException),避免直接写catch(Exception e) - 每个
catch块里必须有明确动作:提示用户、设默认值、记录日志、或抛出自定义业务异常
例如用户输入年龄:
try {
int age = Integer.parseInt(input);
if (age 150) throw new IllegalArgumentException("年龄不合理");
} catch (NumberFormatException e) {
System.out.println("请输入有效的整数");
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
区分异常类型,该处理的处理,该放过的放过
不是所有异常都要 catch:运行时异常(如
NullPointerException、ArrayIndexOutOfBoundsException):通常是代码缺陷,应通过前置校验预防,而不是靠 catch 救火
✅ 好做法:if (str != null && !str.trim().isEmpty())
❌ 坏做法:try { str.length(); } catch (NullPointerException e) { ... }检查型异常(如
IOException、SQLException):编译器强制你面对,必须try-catch或throws向上抛
它们代表外部不确定性(磁盘坏了、网络断了),必须显式应对Error 类型(如
OutOfMemoryError):不要 catch,无法恢复,应优化内存或调整 JVM 参数
用 finally 或 try-with-resources 保资源安全
崩溃常发生在“出错后没关资源”——比如文件句柄没关、数据库连接泄漏,最终拖垮整个系统。-
finally块确保执行(哪怕前面 return 或 throw):适合手动关闭资源 - 更推荐
try-with-resources(自动调用close()):try (FileInputStream fis = new FileInputStream("data.txt")) { // 使用 fis } // 自动关闭,即使发生异常也执行
外层兜底 + 友好反馈
对控制台程序,可在主循环里用 `try-catch` 包住一轮交互,出错后提示并继续等待下一次输入; 对 Web 应用,应在 Controller 层统一捕获未处理异常,返回 HTTP 200 + 业务错误码和中文提示,绝不暴露堆栈。- 记录日志用
logger.error("用户登录失败", e),而不是e.printStackTrace() - 给前端或用户的提示要清晰、无技术术语:“手机号格式不对”比 “NumberFormatException” 有用得多
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











