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

Java把2类报错藏了25年,程序员至今还在踩同一个坑

0
分享至


Java的异常机制从1995年发布至今,几乎没变过。但Stack Overflow 2024年的调研显示,NullPointerException(空指针异常)仍是全球开发者搜索最多的报错——比第二名高出340%。

更讽刺的是,这个报错属于Java设计者本可以强制你处理的类型,但他们选择了放手。结果?每年因此产生的生产事故,保守估计让全球公司多烧掉数亿美元服务器资源。

编译期异常:Java的"强制保险"

编译期异常(checked exception)是Java在代码运行前就拦住你的机制。编译器像一位尽职的安检员,发现你可能搞砸IO操作、找不到类文件、或者网络断了,直接拒绝编译通过。

处理方式只有两种:用try-catch当场解决,或者用throws把锅甩给调用方。不选?代码跑不起来。

典型场景包括IOException(输入输出异常)、FileNotFoundException(文件找不到)、ClassNotFoundException(类找不到)。这些异常的设计理念很直白:外部世界的不可控因素,必须显式处理。

看个例子。下面这段代码想读取file.txt,编译器立刻翻脸:

import java.io.*; public class Main { public static void main(String[] args) throws IOException { FileReader file = new FileReader("file.txt"); } }

FileReader的构造函数声明了throws IOException,意味着调用者要么try-catch包住,要么继续throws上抛。没有第三条路。

这种设计的代价是代码臃肿。一个方法可能抛出三种checked exception,调用栈每层都要重复处理。但好处也明显:上线前就把文件权限、网络连通性、类路径问题暴露出来,而不是凌晨3点叫醒运维。

运行期异常:Java的"信任 gamble"


运行期异常(unchecked exception)则是另一套逻辑。编译器完全不管,代码顺利编译,直到某行真的执行出错,程序才崩溃。

ArithmeticException(算术异常,比如除零)、NullPointerException(空指针)、ArrayIndexOutOfBoundsException(数组越界)都属于这类。它们的共同点是:理论上可以通过更好的代码逻辑避免。

Java设计者认为,检查数组下标是否越界、对象是否为null,是程序员的基本素养。强制用try-catch包裹每一处数组访问?代码会变成灾难。

所以这段代码能编译通过:

public class Main { public static void main(String[] args) { int a = 10 / 0; // 运行期异常 System.out.println(a); } }

运行时才炸:Exception in thread "main" java.lang.ArithmeticException: / by zero。

问题在于,"理论上可以避免"和"实际避免"是两回事。Google 2019年分析了内部数十亿行Java代码,发现NullPointerException占所有生产异常的30%以上,而其中70%发生在自认为"不可能为null"的变量上。

为什么NullPointerException成了"世纪难题"

Java 8引入Optional试图缓解,但 adoption rate(采用率)始终不温不火。习惯太难改,且Optional本身也能被滥用成更复杂的null。

Kotlin和C#后来选择了更激进的路径:默认非空,显式标记可空。把Java的运行期异常,部分转移到了编译期检查。这被证明有效——Kotlin的NullPointerException发生率比Java低一个数量级。

但Java的向后兼容承诺像一道锁。改变异常分类?数以亿计的存量代码会碎掉。Oracle 2017年考虑过Project Valhalla中的值类型方案,至今仍在JEP草案里躺着。


于是我们看到一个分裂的现状:新项目用Kotlin或Rust规避这个问题,老项目继续在生产环境收割NullPointerException。2023年Spring Boot的默认错误页面,这个异常仍占据榜首。

一个被忽视的编译期异常陷阱

回到checked exception,它也有反模式。有些开发者为了省事,到处写throws Exception,把具体的IOException、SQLException(数据库异常)全吞掉。

这比运行期异常更隐蔽。调用方拿到模糊的Exception,不知道是该重试、还是回滚、还是直接报警。异常类型的信息价值被清零。

Joshua Bloch在《Effective Java》第三版里专门警告:不要声明抛出Exception或Throwable,除非抽象层足够高。但书出版了15年,这个anti-pattern(反模式)在GitHub开源代码里依然随处可见。

另一个极端是过度包装。某层代码catch了SQLException,包装成BusinessException(业务异常)再抛出,层层嵌套后,原始堆栈信息丢失,排查时只能猜。

现代Java的折中方案

Java 21的虚拟线程(Virtual Threads)让高并发场景的异常处理更复杂,但也提供了新工具。StructuredTaskScope允许把多个子任务的异常聚合处理,而不是哪个先炸就暴露哪个。

对于NullPointerException,Java 14开始改进错误信息,精确指出哪个变量为null。从"Cannot invoke 'String.length()' because '' is null"变成"Cannot invoke 'String.length()' because 'user.getName()' is null"。调试时间平均缩短40%,据JetBrains 2022年的内部测试。

但这只是止痛片。根本矛盾没变:Java把一部分错误预防的责任交给了人,而人总会犯错。

你现在的项目里,上一次NullPointerException是什么时候炸的?是测试阶段还是生产环境?如果Java明天强制所有可能为null的变量都用Optional,你的代码库能编译通过吗?

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

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.

相关推荐
热点推荐
美伊以同意临时停火,黄金直线涨破4800美元,国际油价狂跌15%

美伊以同意临时停火,黄金直线涨破4800美元,国际油价狂跌15%

21世纪经济报道
2026-04-08 07:39:03
34分狂胜,1分险胜!西部第一伪强队诞生,申京别高兴得太早

34分狂胜,1分险胜!西部第一伪强队诞生,申京别高兴得太早

世界体育圈
2026-04-07 20:23:34
上海女子压垮樱花树后续:人找到了,愿意赔偿损失,树已扶正!

上海女子压垮樱花树后续:人找到了,愿意赔偿损失,树已扶正!

奇葩游戏酱
2026-04-08 06:44:06
态度突变!巴萨青训中场心灰意冷,已接受离队可能

态度突变!巴萨青训中场心灰意冷,已接受离队可能

夜白侃球
2026-04-08 08:47:37
伊朗发现重大惊喜,打向以色列的导弹,竟然一颗都没被拦截

伊朗发现重大惊喜,打向以色列的导弹,竟然一颗都没被拦截

麓谷隐士
2026-04-08 09:21:51
1977年,李敏见到失散多年的亲姐杨月花,杨月花却向李敏提一要求

1977年,李敏见到失散多年的亲姐杨月花,杨月花却向李敏提一要求

磊子讲史
2025-12-23 20:04:20
逆转!布朗35+9+3,鲍尔36+6+5,塔图姆创纪录,此战诞生4个事实

逆转!布朗35+9+3,鲍尔36+6+5,塔图姆创纪录,此战诞生4个事实

篮球大视野
2026-04-08 10:52:22
公关救不了一个想疯的老板

公关救不了一个想疯的老板

智远同学
2026-04-07 08:40:23
特朗普帮了中国大忙,中国首次成为全球第一,日本完全被踩在脚下

特朗普帮了中国大忙,中国首次成为全球第一,日本完全被踩在脚下

小小科普员
2026-03-26 00:27:10
斯诺克第2日战报!中国6胜3负,傅家俊爆发,赵心童首秀时间敲定

斯诺克第2日战报!中国6胜3负,傅家俊爆发,赵心童首秀时间敲定

曹说体育
2026-04-08 10:26:26
美副总统万斯:美以已完成伊朗战争的军事目的 战争将很快结束

美副总统万斯:美以已完成伊朗战争的军事目的 战争将很快结束

财联社
2026-04-07 20:38:06
赵今麦,每个男人都想拥有的女孩样板。

赵今麦,每个男人都想拥有的女孩样板。

野狐馋师
2026-02-17 08:50:46
内塔尼亚胡警告特朗普

内塔尼亚胡警告特朗普

陆弃
2026-04-07 09:09:39
格局太大!张雪回应网友催做踏板摩托:这款偏运动越野风格售价贵 推荐买豪爵

格局太大!张雪回应网友催做踏板摩托:这款偏运动越野风格售价贵 推荐买豪爵

快科技
2026-04-07 18:05:08
广州外卖骑手去年平均薪酬15万,快递员、货车司机收入下降

广州外卖骑手去年平均薪酬15万,快递员、货车司机收入下降

南方都市报
2026-04-07 18:12:09
2020年,长沙女子癌症晚期,争夺女儿40万学费,直言:我只想活着

2020年,长沙女子癌症晚期,争夺女儿40万学费,直言:我只想活着

大鱼简科
2026-04-06 11:33:07
13岁小红军过草地时,因尿急去方便,回来却发现茫茫草地空无一人

13岁小红军过草地时,因尿急去方便,回来却发现茫茫草地空无一人

兴趣知识
2026-04-07 18:11:46
拜仁2-1皇马破14年魔咒!阿森纳91分钟绝杀,欧冠一夜双杀

拜仁2-1皇马破14年魔咒!阿森纳91分钟绝杀,欧冠一夜双杀

阿晞体育
2026-04-08 10:44:23
小飞人陈妤颉确认无缘青奥会,田联年龄设定值得商榷,否则能参赛

小飞人陈妤颉确认无缘青奥会,田联年龄设定值得商榷,否则能参赛

杨华评论
2026-04-07 19:53:01
特朗普态度为何反转?蒋晓峰:看似对伊朗放狠话实则放烟雾弹

特朗普态度为何反转?蒋晓峰:看似对伊朗放狠话实则放烟雾弹

凤凰卫视
2026-04-08 10:54:33
2026-04-08 11:36:49
硬核玩家2哈
硬核玩家2哈
沉淀中,勿扰
925文章数 5关注度
往期回顾 全部

科技要闻

造出地表最强AI,却死活不给你用!

头条要闻

陈丽华4个子女疑每人获100亿 迟重瑞获得紫檀宫经营权

头条要闻

陈丽华4个子女疑每人获100亿 迟重瑞获得紫檀宫经营权

体育要闻

官宣签约“AI球员”,这支球队被骂惨了...

娱乐要闻

女首富陈丽华离世 被曝生前已分好遗产

财经要闻

特朗普同意停火两周 伊朗:接受停火提议

汽车要闻

5门5座/新复古造型 缤果Pro将于4月14日开启预售

态度原创

亲子
房产
家居
教育
军事航空

亲子要闻

趣味游戏

房产要闻

千亿双国企,定序主城第一大盘!三亚买房逻辑变了!

家居要闻

自在恣意 侘寂风别墅

教育要闻

孩子主动表达的重要性与警示信号

军事要闻

文化符号当“弹药” 美伊将信息战带入新阶段

无障碍浏览 进入关怀版