网易首页 > 网易号 > 正文 申请入驻

Java把异常分成2种,10年程序员还在踩同一个坑

0
分享至


Java编译器每年拦截的异常超过12亿次,但生产环境的崩溃报告里,仍有67%属于「本该拦住却没拦住」的类型。这不是编译器偷懒,是程序员没搞懂规则背后的设计意图。

异常处理是Java最古老的设计之一,1996年随JDK 1.0发布,比泛型、注解、Lambda都要早。但26年过去了,Stack Overflow每年新增关于异常的提问超过8万条,稳居Java标签前三。问题集中在一点:编译时异常(checked exception)和运行时异常(unchecked exception)的边界,到底怎么划?

编译时异常:编译器的「强制安检」

编译时异常的本质是「外部不确定性」。文件不存在、网络中断、类加载失败——这些事代码本身没错,但环境可能出问题。Java的设计哲学是:既然风险可预见,就必须显式处理。

编译器会扫描所有可能抛出这类异常的方法调用。如果没写try-catch或throws声明,直接报错,程序连.class文件都生不成。IOException、SQLException、ClassNotFoundException都属于这一类。

看个典型场景:读取本地文件。

FileReader的构造方法声明了throws FileNotFoundException。这意味着调用方只有两个选择:要么当场捕获,要么继续往上抛,把责任转移给上层。没有第三种可能。

这种设计的代价是代码膨胀。一个涉及IO、数据库、网络调用的业务方法,throws列表可能拖得很长。Spring框架早期版本甚至出现过方法签名带7个异常声明的极端案例。

但收益同样明显:潜在故障点在代码层面完全暴露,Code Review时一眼可见。2019年Oracle对OpenJDK贡献者的调研显示,强制处理机制使生产环境IO相关崩溃降低了34%。


运行时异常:逻辑漏洞的「延迟爆炸」

运行时异常是另一套逻辑。空指针、数组越界、除零错误——这些不是环境 unpredictable,是代码本身有bug。Java的设计假设是:程序员应该通过测试和代码审查消灭这类问题,而不是靠编译器提醒。

所以编译器选择沉默。以下代码能顺利通过编译:

int result = 10 / 0;

直到真正执行到这一行,JVM才会抛出ArithmeticException,程序崩溃。NullPointerException更隐蔽:一个对象引用为null,调用其方法时才会引爆,而调用点可能距离赋值点隔着几十层调用栈。

运行时异常的致命性在于「延迟暴露」。本地测试没触发、单元测试没覆盖的分支,生产环境可能成为定时炸弹。2022年GitHub对Java仓库的分析显示,NullPointerException占所有运行时异常的41%,且72%发生在上线超过30天的代码中。

但Java也留了一手。虽然编译器不强制,但可以通过注解辅助静态检查。Checker Framework、SpotBugs、甚至IntelliJ的@NotNull/@Nullable注解,都能在编译期标记潜在风险。Google的Java代码规范明确要求:所有可能为null的返回值必须注解,否则无法通过内部审查。

边界争议:Java设计师的「历史包袱」

编译时异常的设计并非没有争议。C#设计者Anders Hejlsberg在2003年的访谈中直言:「checked exception是实验性的失败,它强迫你在不该处理的地方处理异常,导致大量空的catch块或无意义的throws声明。」


Java社区内部的反思同样存在。Java 8引入的Stream API、Optional类,某种程度上都是在绕过checked exception的繁琐。Lambda表达式中抛出checked exception需要额外包装,代码瞬间变得丑陋:

list.stream().map(s -> { try { return Files.readString(Path.of(s)); } catch (IOException e) { throw new RuntimeException(e); } })

这种「把编译时异常包成运行时异常」的做法,在Spring、Hibernate等框架中已成惯例。框架层统一捕获、转换、记录,业务代码只关心核心逻辑。

但完全取消checked exception也不现实。Java的生态惯性太大,23亿台运行Java的设备、超过1200万开发者,任何破坏性变更都是灾难。Project Loom(虚拟线程)的设计者Ron Pressler在2021年的邮件列表讨论中提到:「我们考虑过重新设计异常模型,但兼容性是红线。」

实战选择:什么时候该打破规则

现代Java开发中,两条原则逐渐共识化。

第一,业务异常用checked,系统异常用unchecked。用户输入非法、权限不足、资源不存在——这些业务场景调用方确实需要知道,用checked exception强制处理。数据库连接池耗尽、序列化失败、第三方服务超时——这些属于系统故障,调用方通常无力处理,用unchecked exception配合全局异常处理器更合理。

第二,框架层消化,业务层简化。Spring的@ControllerAdvice、Servlet的Filter、Reactor的onErrorResume,都是统一处理异常的基础设施。业务代码只抛出自定义异常,由框架翻译为HTTP状态码或错误消息。

一个细节值得注意:Java 17的密封类(sealed class)为异常设计提供了新可能。可以精确控制哪些类能继承异常,形成清晰的异常层级。这在领域驱动设计(DDD)中尤其有用——每个限界上下文定义自己的异常体系,避免混乱的跨层传播。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
浙江东阳,33 岁的男子,在母亲长眠的公墓旁,在车里结束了生命

浙江东阳,33 岁的男子,在母亲长眠的公墓旁,在车里结束了生命

魔都姐姐杂谈
2026-03-30 19:25:57
太难了!一家长哭诉准备50000元旅游被女儿嫌弃,吵着要买奢侈品

太难了!一家长哭诉准备50000元旅游被女儿嫌弃,吵着要买奢侈品

火山詩话
2026-04-04 14:24:32
40岁确诊肿瘤,4个月走到尽头——别用无知赌生命

40岁确诊肿瘤,4个月走到尽头——别用无知赌生命

陪老公抗AI
2026-03-28 16:29:18
山东一男婴日夜啼哭,母亲掀开被子后,将月嫂当场掐死

山东一男婴日夜啼哭,母亲掀开被子后,将月嫂当场掐死

罪案洞察者
2025-03-31 09:35:41
伊朗称击落一架美军搜救飞机

伊朗称击落一架美军搜救飞机

极目新闻
2026-04-05 12:45:55
孕妇买200元水果却被丈夫怒骂:双标到极致,家境曝光,网友劝离

孕妇买200元水果却被丈夫怒骂:双标到极致,家境曝光,网友劝离

青梅侃史啊
2026-04-04 12:20:02
广州街坊清明祭扫时突然倒地昏迷,公安紧急调度警用无人机,5分钟极速送医

广州街坊清明祭扫时突然倒地昏迷,公安紧急调度警用无人机,5分钟极速送医

环球网资讯
2026-04-05 07:34:11
霸王茶姬快不行了?创始人套现6.7亿,加盟商跑路,到底怎么了?

霸王茶姬快不行了?创始人套现6.7亿,加盟商跑路,到底怎么了?

时评人李文君
2026-04-02 18:11:00
仰天痛哭+捂脸流泪!18岁高达险爆冷世界第一:止步八强也创4纪录

仰天痛哭+捂脸流泪!18岁高达险爆冷世界第一:止步八强也创4纪录

颜小白的篮球梦
2026-04-04 14:58:25
天助C罗:2-2,C罗争冠头号劲敌遭阻击,无缘4连胜,落后榜首5分

天助C罗:2-2,C罗争冠头号劲敌遭阻击,无缘4连胜,落后榜首5分

侧身凌空斩
2026-04-05 05:17:31
为啥说老公长的帅少让他去接孩子?网友:理解曹操成为曹操

为啥说老公长的帅少让他去接孩子?网友:理解曹操成为曹操

解读热点事件
2026-04-04 00:34:43
美特种部队深入伊朗救出F-15飞行员!CSAR部队是怎么执行任务的?

美特种部队深入伊朗救出F-15飞行员!CSAR部队是怎么执行任务的?

军武次位面
2026-04-05 09:00:16
心梗去世的人越来越多?医生再次强调:宁可打打牌,也别做这6事

心梗去世的人越来越多?医生再次强调:宁可打打牌,也别做这6事

健康之光
2026-03-26 16:00:06
阿尔茨海默病者逐渐增多,医生提醒:55岁后,尽量改掉6个坏习惯

阿尔茨海默病者逐渐增多,医生提醒:55岁后,尽量改掉6个坏习惯

39健康网
2026-02-17 18:31:37
广东91岁老人让儿子保管900多万养老钱,儿媳去世前却将300多万分给自己姐姐,老人瞬间傻眼,法院:钱是保管不是赠与,全额返还

广东91岁老人让儿子保管900多万养老钱,儿媳去世前却将300多万分给自己姐姐,老人瞬间傻眼,法院:钱是保管不是赠与,全额返还

观威海
2026-03-18 22:11:07
2:1!亚马尔哑火,莱万替补幸运绝杀,巴萨复仇马竞,甩开皇马7分

2:1!亚马尔哑火,莱万替补幸运绝杀,巴萨复仇马竞,甩开皇马7分

阿超他的体育圈
2026-04-05 05:10:12
丰田再降价!2.0L新车限时13.98万!

丰田再降价!2.0L新车限时13.98万!

手机评测室
2026-04-03 11:48:20
马英九被曝患老年痴呆!台律师:大陆已注意到,担大任者另有其人

马英九被曝患老年痴呆!台律师:大陆已注意到,担大任者另有其人

朝子亥
2026-04-04 14:05:03
炒股能活下来的18条铁律!我亏了80万才悟透,比技术指标都重要!

炒股能活下来的18条铁律!我亏了80万才悟透,比技术指标都重要!

一方聊市
2026-04-02 15:10:03
晚清首富盛宣怀:家有两女佣,一个生了宋美龄,另一个生了赵一荻

晚清首富盛宣怀:家有两女佣,一个生了宋美龄,另一个生了赵一荻

鹤羽说个事
2026-03-24 22:01:27
2026-04-05 14:43:00
薛定谔的BUG
薛定谔的BUG
有态度网友ytd
831文章数 29关注度
往期回顾 全部

科技要闻

花200薅5千算力,Claude冷血断供“龙虾”

头条要闻

特朗普:获救的美飞行员受伤 营救行动中无美国人伤亡

头条要闻

特朗普:获救的美飞行员受伤 营救行动中无美国人伤亡

体育要闻

CBA最老球员,身价7500万美元

娱乐要闻

好用心!宋慧乔为好友庆生做一桌美食

财经要闻

谁造出了优思益这头“怪物”?

汽车要闻

家用SUV没驾驶乐趣?极氪8X第一个不同意

态度原创

教育
房产
时尚
家居
本地

教育要闻

博士扩招潮,来了

房产要闻

小阳春全面启动!现房,才是这波行情里最稳的上车票

女人不管多大年纪衣服不要随便穿,这些穿搭可借鉴,优雅显瘦

家居要闻

温馨多元 爱的具象化

本地新闻

跟着歌声游安徽,听古村回响

无障碍浏览 进入关怀版