if-else用于主动校验可预知逻辑分支,如参数非空、业务规则判断;try-catch用于兜底不可预见的运行时异常,如空指针、IO失败。二者协作:先if轻量校验,再try-catch包裹高风险操作,避免混用或滥用。

核心在于:if-else 用来防错,try-catch 用来兜底。
适用场景有明确分工
if-else 处理的是你“能提前知道、应该主动检查”的情况:
- 输入是否为空、是否为数字、是否在合法范围内(如年龄≥0、除数≠0)
- 业务规则判断(如用户等级是否达标、订单状态是否允许退款)
- 资源前置条件(如文件是否存在、网络连接是否已建立)
这些不是程序“意外崩溃”,而是逻辑上本就该拦住的分支,用 if 判断更自然、性能更好、意图更清晰。
try-catch 应对不可预见的运行时故障
它不用于替代常规校验,而是覆盖那些你无法静态预判、也无法靠 if 完全堵住的意外:
立即学习“Java免费学习笔记(深入)”;
- 系统级异常:NullPointerException(对象为 null 却调用了方法)、ArrayIndexOutOfBoundsException(数组越界)
- 外部依赖失败:IOException(读写文件/网络超时)、SQLException(数据库连接中断)
- 受检异常强制要求:Java 编译器会报错,逼你必须用 try-catch 或 throws 处理 FileNotFoundException 等
这类问题往往发生在底层 API 调用中,你控制不了它的发生时机,只能等它抛出来再响应。
混用时的关键原则
两者不是互斥,而是协作。常见合理组合方式:
- 先用 if 做轻量级校验(比如检查参数非空),避免无谓进入高风险操作
- 再用 try-catch 包裹真正可能崩的调用(比如解析 JSON 字符串、打开流、执行 SQL)
- 不要用 try-catch 去捕获本该用 if 拦住的问题(例如把
if (str == null)换成try { str.length(); })——这既低效又掩盖设计缺陷 - 捕获要具体:优先 catch ArithmeticException 而非笼统的 Exception,避免误吞其他真正该暴露的错误
性能与可维护性提醒
throw/catch 异常有实际开销:创建异常对象、填充堆栈跟踪。频繁用它做流程控制(比如当“goto”用)会拖慢程序。
if 分支是编译期确定的跳转,零额外成本;而异常是运行时事件驱动机制,适合偶发故障,不适合高频逻辑分支。
代码可读性上,if 明确表达了“我预期这个条件可能发生”;try-catch 则暗示“这段代码有不确定性,我准备好了应对方案”。滥用任一者都会让别人读不懂你的设计意图。


















