array(5) { ["chapterid"]=> string(8) "49247947" ["articleid"]=> string(7) "7279460" ["chaptername"]=> string(7) "第2章" ["content"]=> string(12290) "陈序以为自己会撞上屏幕。

可屏幕没有碎。

它像一口黑色的井,直接把他吞了进去。

黑色利爪扣住肩膀的瞬间,世界像被人强行按下静音键。办公室、告警群、手机震动、项目经理的电话,全都被拉成长长的噪点,从耳边一寸寸退远。

他眼前只剩那块黑屏。

下一秒,他整个人被拖了进去。

不是坠落。

更像是被塞进一段过长的异常日志里。

红色异常栈从四面八方掠过,密密麻麻,像倒着飞的车灯。每一行都擦着他的脸过去,带出冰冷的风。

NullPointerException

NullPointerException

NullPointerException

陈序想骂人。

嘴张开,却没发出声音。

空气不见了。

准确地说,他不知道自己现在算不算还在空气里。四周是一片黑色,脚下没有地,头顶也没有天。只有一行行异常日志像雨一样落下,砸在看不见的地面上,溅起红色碎光。

肩膀上的那只手还在。

冰冷、细长,像一段没有对象的引用,死死挂在他身上。

陈序伸手去掰。

手指穿过去了。

那东西没有实体。

但疼是真的。

它扣住的不是皮肉,而像是某种更里面的东西。陈序能感觉到,自己肩膀后面有一条看不见的线正在被往外扯。

一下。

又一下。

每扯一下,他脑子里就空一瞬。

刚才在查什么?

订单。

支付。

RealityService.java:404。

陈序猛地咬住舌尖。

痛感把他拉回来。

“别睡。”

他对自己说。

声音终于出来了,哑得不像自己的。

黑影从前方浮现。

它已经不再只是屏幕里的手。那团墨一样的东西慢慢拉长,像披着一件湿透的黑衣。没有脸,没有眼睛,身体边缘不停散开,又重新聚合。

它靠近时,周围所有日志都暗了一下。

陈序后退。

脚下忽然踩到了东西。

不是地面。

是一串横着铺开的代码。

细碎的字符在他脚底亮起,像一座正在加载失败的桥。桥的尽头隐约连着一片灰白色平台,平台之外还是黑,黑里有无数红色异常在游动。

他踉跄着站稳。

第一反应不是喊,也不是跑。

他低头看脚下。

“有路径。”

这念头冒出来的瞬间,陈序自己都觉得荒唐。

都什么时候了,还在看路径。

可这就是他。

越是出事,越要先看现场结构。

黑影没有给他太多时间。

它抬起手。

没有手腕的利爪从身体里长出来,透明、细长,像玻璃里冻住的针。利爪划过空气时,周围那些异常日志突然改变方向,全部指向陈序。

target = null

陈序看见这行字的时候,胸口猛地一冷。

利爪已经到了面前。

他抬手挡。

没用。

利爪穿过他的手臂,直接刺进胸口。

没有血。

但陈序的视野黑了一块。

不是疼,是空。

那一瞬间,他忘了自己的工位在哪,忘了手机掉在什么地方,甚至连公司那套老系统叫什么名字都模糊了一下。

这东西在删东西。

不是删身体。

是在删“他是谁”。

陈序往后退了两步,膝盖差点跪下去。

黑影没有声音。

但他知道它在靠近。

那些异常日志在它身后拖成一条长尾,像一群跟着腐肉飞的虫子。

陈序胸前的工牌亮了。

那是他从现实里带进来的唯一东西。塑料壳已经不见了,边缘浮着淡淡的金光,原本印着公司名字和工号的地方,只剩几行歪歪扭扭的字符。

try {

只有开头。

没有后面。

陈序盯着它,喘了两口气。

他太熟了。

每个 Java 程序员都熟。

程序有可能出错,所以要捕获异常。

但问题是——

他现在不是在写代码。

他在被异常追着杀。

黑影再次抬手。

这一次,利爪分成三道,从前方、左侧、背后同时刺来,像三条同时抛出的空引用。

陈序扭头想躲。

脚下代码桥突然断了一截。

他整个人往下坠。

坠落的瞬间,胸前工牌上的金色字符猛地闪了一下。

陈序几乎是本能地喊了出来。

“catch!”

声音落下的瞬间,周围所有红色日志停住了。

只停了一瞬。

但够了。

陈序胸前那行残缺的 try { 后面,凭空补上了一道右括号。紧接着,一圈金色字符从他脚下炸开,像有人用无形的手在黑暗里画出一个圆。

try {

// alive

} catch (NullPointerException e) {

}

那不是完整代码。

甚至丑得像临时救火时写出来的补丁。

但它亮了。

金色光圈向外一扩,三道黑色利爪撞在边缘,发出刺耳的摩擦声。利爪没有被弹飞,而是被硬生生卡住,像三根扎进玻璃罩里的针。

陈序摔在金色圆环中央,肩膀和后背都疼。

可他笑了一下。

不是得意。

是劫后余生那种短促、难看的笑。

“你是异常。”

他抬头看着那团黑影,嗓子还在发抖。

“那我就捕获你。”

黑影第一次停住。

它没有五官,陈序却感觉它在“看”自己。

下一秒,更多异常从黑暗里亮起。

NullPointerException

NullPointerException

NullPointerException

一行接一行。

像整片黑暗都在报同一个错。

金色圆环开始晃。

陈序低头,发现那段 catch 后面是空的。

捕获了。

但没处理。

这就像线上代码里写了个空 catch。

不报错,不代表问题解决了。

只是把锅埋进了更深的地方。

“靠。”

陈序扶着地面爬起来。

“这也太真实了。”

黑影的利爪还卡在圆环上,它一点点往里压。金色字符被压得变形,像快要崩开的铁丝。

陈序快速扫视四周。

没有武器。

没有人。

没有 IDE。

只有自己、这块临时捕获结界,还有一只正在往里挤的空指针怪物。

他试着后退,发现圆环只护住脚下这一小片区域。

跑不了太远。

也不能一直防守。

工牌还在发烫,字符在边缘游动,像在等他输入下一步。

异常捕获之后,要处理。

问题是怎么处理?

日志?报警?重试?

不够。

黑影没有实体,普通攻击没用。它攻击的是引用,是“目标为空”。那就不能拿拳头打它,得先让自己有一个能承载的东西。

对象。

陈序低头看着自己的手。

他从没觉得“对象”这个词这么亲切过。

他抬起手,试着在空气里写下一个字。

new

金色字符刚成形,就散了。

陈序皱眉。

不行。

他只是知道 new,但不知道要 new 什么。

这跟项目里随便写个类名不一样。现实里编译不过最多红线,现在写错,可能就是命没了。

黑影往前压了一寸。

金色圆环发出细碎的裂声。

陈序肩膀上的冷意再次加重。刚才那只手残留的感觉还在,像一段没释放干净的引用。

他忽然想起办公室里那把椅子。

被他撞翻的椅子。

普通、廉价、坐久了腰疼,轮子还坏了一个。

但他知道它长什么样。

知道靠背、底座、轮子、扶手,甚至知道左边扶手下面有一道裂。

理解过结构。

才能创建对象。

陈序深吸一口气。

他抬起手,写下第二行。

new Chair()

金光亮了一下。

下一秒,一把金色轮廓的办公椅凭空砸了下来。

陈序:“……”

黑影:“……”

整个黑暗里安静了一瞬。

那把椅子看起来很寒酸,甚至还是他办公室那把破椅子的样子。金色代码构成椅背,四个轮子一边高一边低,落地的时候还歪了一下。

陈序自己都沉默了。

但来不及嫌弃。

黑影利爪已经压碎圆环边缘,冲了进来。

陈序抓起椅子就砸。

砰!

椅子穿过黑影半截,没能造成实质伤害,却把一团红色异常日志打散了。

有效。

但不多。

黑影的身体重新聚合,利爪再次刺来。

陈序侧身躲开,金色椅子在手里裂出一道口子。那不是武器,它只是个临时对象,结构太弱,撑不了几下。

但陈序眼睛亮了。

能创建。

那就够了。

他不再试图造复杂东西。

复杂的他现在不懂,造出来也不稳。

他需要最简单、最明确、最能挡一下的结构。

new Shield()

这一次,金色字符没有立刻成形。

陈序脑子里一空。

Shield 的结构是什么?

盾牌?

形状?厚度?边缘?握把?

他以前没写过 Shield 类。

黑影的利爪再次压来。

陈序抬起椅子硬挡,椅背瞬间碎了一半,金色代码崩成一片光屑。

他被震得手臂发麻。

也就在那一瞬间,他想明白了。

防御不是一块铁。

防御是边界。

防火墙是边界。

网关是边界。

参数校验是边界。

接口鉴权也是边界。

陈序咬着牙,把脑子里所有乱七八糟的画面拆开:外层挡攻击,中层识别异常,内层保护目标。

金色字符终于稳定下来。

一面半透明的金色盾牌在他手臂前展开。

不漂亮。

边缘还在抖。

但它挡住了利爪。

这一下,陈序被震得整个人往后滑了半米。

黑影的爪子被盾牌卡住。

盾面上浮出一串细小的错误信息。

captured: NullPointerException

source: unknown

“源头未知……”

陈序喘着气,忽然笑了一下。

“那就先别急着杀。”

他反手把盾往前一推。

金色 catch 结界顺着盾面扩散,像一张临时兜网,套住了黑影的一只利爪。黑影剧烈扭动,整片黑暗跟着震了一下。

那些悬浮的异常日志开始乱跳。

陈序听见了声音。

不是耳朵听见的。

像是有一行提示直接贴在脑子里。

Java Adapter initializing...

Exception handling module loaded.

陈序刚想看清,黑影突然撕裂了自己的手臂。

被 catch 结界套住的那只利爪断开,化成一片红色日志。它借着断臂的瞬间往后退,身体重新缩回黑暗深处。

金色结界捕获了那截断爪。

陈序没有追。

他追不了。

手臂抖得厉害,胸口那片被刺中的地方还在发冷。更糟糕的是,他能感觉到自己的记忆边缘有一块空了一点,像被橡皮擦蹭过。

黑影没有消失。

它只是退到了更远的地方。

周围黑暗开始褪色。

红色异常雨一点点变淡,脚下那座由代码组成的平台终于露出完整轮廓。平台不大,边缘布满裂缝,外面是看不到底的深渊。

远处,传来低沉的风声。

风里夹着分号、括号和像服务器风扇一样的嗡鸣。

陈序站在原地,握着那面快要散架的金色盾牌。

他低头看向自己的工牌。

工牌已经不再是现实里的员工卡。

上面的公司 Logo 消失了。

工号也消失了。

只剩一行新的字,像刚刚被系统刻上去。

Name:ChenXu

Type:Java Adapter

Status:Activated

陈序盯着那几行字,沉默了很久。

然后他抬头,看向黑暗深处。

那里,空指针幽灵只剩半截身体,像一团被打散又强行聚合的墨。它没有脸,却仍然让人觉得它在笑。

陈序握紧盾牌。

“Java 适配者……”

他念了一遍,语气说不上是接受,还是想骂。

下一秒,脚下平台猛地一震。

远处黑暗裂开一条缝。

缝隙后面,不再是办公室。

也不是日志通道。

而是一片陌生的荒原。

天空深蓝,挂着一条巨大的编译进度条。

Compiling world... 99%

荒原尽头,有一座城市正在闪烁。

它不像现实里的城市,更像一个随时会宕机的服务。高塔亮了又灭,道路像接口一样断断续续,天空里的代码雨落到一半,就碎成了红色异常栈。

陈序还没来得及看清,胸前源码铭牌忽然跳出新的提示。

警告

RealityService 初始化失败。

缺失依赖:ChenXu

Null 源正在接近。

黑暗深处,更多透明利爪慢慢伸了出来。

不是一只。

是一群。" ["create_time"]=> string(10) "1785508759" }