异常不应用于流程控制,而应仅处理意外情况;业务状态应通过返回值表达,避免滥用RuntimeException,合理使用预判方法、结果封装类和防御性校验。
在Java中,用异常来控制程序流程是一种常见但危险的习惯。异常本意是处理“意外情况”,而非替代正常的条件判断。滥用会导致性能下降、逻辑混乱、调试困难,甚至掩盖真正的问题。
比如检查文件是否存在时,调用 file.delete() 后靠捕获 SecurityException 或 IOException 来判断权限或路径有效性,这是错的。应先用 file.exists()、file.canWrite() 等方法预判。
用户输入格式错误、网络超时、数据库连接失败——这些属于需要响应的异常场景;而“用户名已存在”、“库存不足”、“订单状态不支持此操作”——这些是业务规则下的合法状态,应通过返回值(如 Optional、自定义结果类、枚举状态码)表达,而非抛出 RuntimeException。
on 自造“业务异常”,除非该异常确实需跨多层中断流程并被顶层统一处理资源管理要精准:只在真正持有外部资源(IO、DB连接、锁)时才用 try-with-resources;不要为普通对象或临时计算加一层无意义的 try。finally 中避免抛出新异常,否则可能吞掉原始异常。
写测试时,不仅验证正常路径,还要覆盖边界输入,并断言是否抛出了不该抛的异常。例如:
不复杂但容易忽略:把“会不会发生”交给条件判断,把“发生了怎么办”留给异常处理。代码健壮性不来自拼命 catch,而来自清晰的契约和克制的异常使用。