终端里滚过一行红字,你只看到 Exception,剩下的全是英文和类名。截图发群里,等半小时没人回;自己搜,搜出来的全是英文论坛。
这一页是一张“查词表”:把你看到的关键词圈出来,对照含义、最常见的原因和下一步,不用读懂整段堆栈。
用它的方式很朴素:先找到那行字,再在下面几张表里搜一遍。命中就按“去哪”那列走;不命中,再按最后一节的四个动作继续缩小。
只取异常的第一行:
java.lang.XxxException: 具体消息。后面几十行at ...先别看。根因通常在 最后一个
Caused by:,不是最外层那句“启动失败”。真正要处理的是重复出现的
ERROR;只出现一次的WARN大多可以放着。退出码 137 更可能是被系统杀的,不等于一定是内存不足。
终端没有搜索框,先「复制当前日志」,粘到别处再搜。
这张表怎么用:三步#
只取第一行。堆栈的第一行才有信息量,后面的
at net.minecraft...是调用路径,对判断方向没帮助。往下找
Caused by:。Java 异常层层包裹,最后一段才是根因。只有一段时,第一行就是根因。对照下面的表,按“去哪”那列走。每张表都按主题分好了,从你最怀疑的那类开始。
终端屏幕上最多显示 300 行,单行超过 400 字符会被截断。但「复制当前日志」复制的是整段会话日志,比屏幕上看到的多——所以出问题时先点复制,再慢慢看。终端没有搜索、没有导出、也没有命令历史,这也是要复制出去的原因。用法见 终端与快捷指令。
Java 与启动#
| 关键词 | 含义 | 常见原因 | 去哪 |
|---|---|---|---|
UnsupportedClassVersionError | Java 版本不对,跑不了这个核心 | 核心要 21,你给了 17 | Java 版本 |
class file version 65.0 | 服务端要求的 Java 版本 | 65 = Java 21,61 = Java 17 | Java 版本 |
requires Java 21 or higher | 核心明确要求更高 Java | 环境版本偏低 | 运行环境 |
Could not find or load main class | 找不到主类 | jar 损坏、启动参数错 | 启动失败 |
no main manifest attribute | 这个 jar 不是可执行服务端 | 下载成 API 包或源码包 | 下载核心 |
Unable to access jarfile | 找不到 jar 文件 | 文件名/路径不对 | 启动失败 |
Invalid or corrupt jarfile | jar 文件损坏 | 下载中断、存储写坏 | 下载核心 |
You need to agree to the EULA | 服务端认为 EULA 没同意 | 你手动把 eula.txt 改成了 false | 启动失败 |
端口与网络#
| 关键词 | 含义 | 常见原因 | 去哪 |
|---|---|---|---|
FAILED TO BIND TO PORT | 端口监听失败 | 端口被占用、端口号 <1024 | 启动失败 |
Address already in use | 端口已被别的进程占用 | 上一个服务端没退干净 | 启动失败 |
BindException | 绑定端口时报错 | 同上 | 启动失败 |
Connection refused | 对方端口没开 | 服务端没起、映射填错 | 客户端报错 |
Connection timed out | 连接超时 | 防火墙/NAT/地址错 | 联机排错 |
Unknown host / UnknownHostException | 域名解析失败 | 域名拼错、无网络 | 客户端报错 |
Invalid session | 正版会话失效 | 启动器登录过期 | 客户端报错 |
Failed to verify username | 用户名验证失败 | 正版/离线模式混用 | 客户端报错 |
模组与插件#
模组#
| 关键词 | 含义 | 常见原因 | 去哪 |
|---|---|---|---|
requires mod ... which is missing | 缺前置模组 | 只装了主模组 | 模组冲突 |
Incompatible mod set! | 模组集合不兼容 | 游戏版本或加载器混用 | 模组冲突 |
Mixin apply failed | Mixin 注入失败 | 两个模组改同一处 | 模组冲突 |
Duplicate mod | 同一个模组装了两份 | 新旧 jar 并存 | 模组冲突 |
Mod resolution | 模组依赖解析失败 | 版本链对不上 | 模组冲突 |
fabricloader / mod loading has failed | 加载器阶段就失败 | 核心与模组不配套 | 模组安装 |
插件#
| 关键词 | 含义 | 常见原因 | 去哪 |
|---|---|---|---|
Unsupported api-version | 插件要求的 API 版本更高 | 核心太旧、插件太新 | 插件管理 |
Could not load plugin ... main class | 主类找不到 | jar 损坏、下成了模组 | 插件管理 |
plugin.yml / paper-plugin.yml 报错 | 插件描述文件有问题 | 包结构不对 | 插件管理 |
NoSuchMethodError | 调用的方法核心没有 | 插件与核心版本不匹配 | 插件管理 |
Plugin is disabled | 插件被禁用 | 初始化异常,看后续堆栈 | 模组冲突 |
世界、内存与存储#
世界与存档#
| 关键词 | 含义 | 常见原因 | 去哪 |
|---|---|---|---|
Failed to load level | 世界读不进去 | 元数据损坏、降级打开 | 崩溃与存档 |
level.dat | 世界元数据文件 | 写一半、丢失 | 崩溃与存档 |
Region file / is truncated | 区域文件损坏 | 异常断电、存储写满 | 崩溃与存档 |
Chunk file at ... is missing | 单个区块丢了 | 未正常关服 | 崩溃与存档 |
newer version | 世界由更高版本保存 | 降级打开 | 崩溃与存档 |
内存与 GC#
| 关键词 | 含义 | 常见原因 | 去哪 |
|---|---|---|---|
OutOfMemoryError: Java heap space | 堆内存不足 | 人数、视距、实体、泄漏 | 内存与 CPU |
OutOfMemoryError: Metaspace | 类元数据区不足 | 模组/动态类过多 | 内存与 CPU |
GC overhead limit exceeded | GC 回收不出空间 | 堆太小、对象都活着 | 内存与 CPU |
StackOverflowError | 调用栈溢出 | 递归太深、模组互相调用 | 内存与 CPU |
Killed / SIGKILL | 进程被强制杀死 | 内存压力、系统清理 | 后台保活 |
权限与存储#
| 关键词 | 含义 | 常见原因 | 去哪 |
|---|---|---|---|
Permission denied | 没有权限 | 存储权限没给、目录不可写 | 运行诊断 |
Read-only file system | 文件系统只读 | 存储异常、SD 卡问题 | 启动失败 |
No space left on device | 存储空间满了 | 备份/日志占满 | 备份策略 |
not whitelisted | 不在白名单 | 没加人、白名单开关状态 | 白名单与 OP |
You do not have permission | 权限不足 | OP 等级或权限插件 | 白名单与 OP |
Failed to save / Could not save | 存档写入失败 | 空间不足、文件被占用 | 崩溃与存档 |
性能与通用关键词#
| 关键词 | 含义 | 常见原因 | 去哪 |
|---|---|---|---|
Can't keep up | 服务端跟不上 | TPS 低、实体多 | TPS |
Running behind | tick 超时 | CPU、区块生成 | 综合优化 |
Watchdog | 看门狗终止卡死的服务端 | 死循环、长时间卡顿 | 崩溃与存档 |
The server has not responded | 主线程长时间无响应 | 同上 | TPS |
Done (…s)! | 启动成功的标志 | — | 不用处理 |
Stopping server | 正常关服 | 你或自动化点了停止 | 不用处理 |
退出码与日志级别#
退出码:1、137、143 大概是什么意思#
崩溃报告的摘要里有一行「退出码: N」。它比日志关键词更“硬”,但也不是万能解释:同一个数字可能有多种原因,下面只是常见含义。
| 退出码 | 大致含义 | 能确定到什么程度 |
|---|---|---|
0 | 进程自己正常结束 | 确定。除非发生在启动 20 秒内,否则不算崩溃 |
1 | 程序报错后退出,通常伴随 Java 异常 | 确定是“出事了”,但具体原因必须看日志 |
137 | 被 SIGKILL 强制杀死,常见于内存压力或系统清理 | 应用会解释成“通常表示 SIGKILL”;137 更可能是被系统杀,不等于一定是 OOM |
143 | 收到 SIGTERM 后退出,常见于被要求停止 | 大概率和停止流程有关,仅供参考 |
130 | 被中断(类似 Ctrl+C) | 不确定,多数出现在手动干预时 |
退出码只说明“进程怎么结束的”,不说明“为什么”。137 可能是低内存杀手,也可能是厂商省电策略;1 可能是 Java 版本错,也可能是模组崩了。正确的顺序是:先看退出码定方向,再看日志定原因。
日志级别:哪些是噪音,可以直接忽略#
一行日志长这样:[12:34:56] [Server thread/INFO]: 内容。方括号里第二段是级别。
| 级别 | 意思 | 要不要管 |
|---|---|---|
INFO | 正常信息 | 不用管,绝大多数行都是它 |
WARN | 警告,功能还能跑 | 反复刷同一条时才管 |
ERROR | 出错了 | 要管,尤其是重复出现的那种 |
FATAL | 致命错误,通常紧跟退出 | 一定要管 |
可以先放着不管的几类:
大量
INFO加载信息,比如注册方块、加载进度;Can't keep up! Is the server overloaded?偶尔出现一次——掉刻但没崩,观察即可;Unknown recipe/Ignoring advancement这类数据包小问题;启动时出现一次
ClassNotFoundException,但服务端最后照样Done,可能是可选依赖。
判断标准就一句:有 Done、能连上、没有反复刷 ERROR,就先不动。
搜不到怎么办:四个动作#
复制出去再搜:终端点「复制当前日志」,粘到备忘录或发到电脑上,用搜索功能找关键词。
搜英文那半句:开了日志汉化,一行会显示成「中文摘要 + 原文」。中文摘要是给人看的,搜索永远搜英文那半句。
去文件里翻:完整日志在服务端目录的
logs/latest.log,用「文件」页的文本编辑器打开,或通过 FTP 拉到电脑上看。目录结构见 服务器目录。按时间点缩小:只发生在启动时?进人时?跑图时?定时任务触发时?时间点能把范围砍掉一大半。
还是找不到,就按这个格式去问人,比截图有效得多:
Minexa 版本:1.5.0
服务端:Paper 1.21.1
Java:Termux Java 21
现象:启动 10 秒后退出 / 卡在 Preparing level
最近改了什么:装了 XX 插件
日志:(粘贴含 Caused by 的那一段)几十行 at net.minecraft... 对搜索没有帮助,还会把真正的那一行埋掉。搜异常类型和消息,命中率高得多。
你能从终端里指出异常的第一行(
java.lang.XxxException: ...)。你找到了最后一段
Caused by:,并说出它属于哪一类(Java / 网络 / 模组 / 世界 / 内存)。「更多 → 崩溃报告」里的「退出码」你能读到具体数字,不是空。
你已经用「复制当前日志」把日志复制到能搜索的地方。
服务端最后出现了
Done (…s)!,或者你确认它没有出现。