Skip to content

崩溃报告诊断

-1、Minecraft 异常报错后该怎么做?

游戏过程中发生崩溃,大多数情况下与玩家的游戏行为无关 (如“打开铁砧 GUI 报错”“合成染色玻璃报错”等等),往往是系统或模组引起的。因此向玩家行为进行限制 (如“不要使用铁砧”“不要合成染色玻璃”等) 治标不治本。
如果你使用 HMCL、PCL 等启动器启动游戏,游戏崩溃后,在崩溃界面点击「导出游戏崩溃信息」,你会得到一个压缩包。如果你需要他人的帮助,请将整个压缩包发送给对方,而不是仅仅发送屏幕的截图
这篇文章将会教你如何进行基础排错诊断,对于没有 Java 项目经历的人可能有些吃力,请不要害怕向他人求助。

0、Minecraft 报错排查

造成 Minecraft 报错的原因有很多,即使是经验丰富的模组和整合包开发者,也需要对崩溃日志进行分析才能确定崩溃的原因。所以,你往往无法通过一张崩溃界面截图判断问题的原因。
在开始排查之前,为了避免不必要的麻烦,请进行如下自测:

  1. 你是否是直接在压缩包中打开了游戏? 在压缩包中打开游戏,启动器会在临时目录中建立游戏目录,即使侥幸没有报错,下次启动游戏时也不会读取到上次游戏的进度。如果是,请解压后重新打开游戏。
  2. 你的启动器是否有更新版本? 如果是,请下载最新版的启动器并重新启动游戏。
  3. 你是否直接从其它设备将游戏目录复制到了自己的设备上运行? 直接复制后,游戏的启动参数可能会指向一些错误和缺失的目录。如果是,请重装游戏版本。
  4. 你是否近期更换了启动器(即,跨启动器管理游戏目录)? 由于不同启动器之间的目录管理方式不同,且业界并没有明确成文的协议和标准,因此跨启动器管理游戏目录会带来很多奇怪的问题。请明确迁移到某个特定的 Minecraft 启动器后重装游戏版本。
  5. 你的游戏目录是否有非英文字符? 如果包含,请将它们改成英文。下面是一些含有非英文字符的例子:
    C:\Users\Administrator\Desktop\Minecraft 整合包\
    D:\迅雷下载\
    C:\Users\コトリ\Desktop\Minecraft\
  6. 你是否修改过“Java 虚拟机参数”? 网上有营销号宣称,在启动器中输入一串启动器参数会提高游戏性能。事实上这些启动器参数的含义是使用了实验性的 Java 虚拟机功能,除了仅仅在特定的 Java 版本中有效之外,还有可能向系统引入不稳定性,引起更加严重的后果。如果是,请清除来历不明的 Java 虚拟机参数(整合包作者、服务器管理员要求添加的除外)。
  7. 你是否在 64 位操作系统中安装了 32 位的 Java? 由于 32 位操作系统最大仅支持 2^32 Bytes = 4294967296 Bytes = 4 GB 内存,因此 32 位的 Java 的堆内存上限仅有 1 GB。如果是,请卸载你的 32 位 Java,并安装 64 位 Java。

1、Java 问题

Minecraft 游戏版本和 Java 版本存在如下对应关系:

Minecraft 版本Java 版本备注
≤ 1.7.2≤ Java 8若安装 Forge 并使用 Java 8,请安装 Legacy Java Fixer 模组。
> 1.7.2Java 8
≤ 1.15.21.12.2 版本若安装了 Cleanroom 模组,请使用 Java 21。
≥ 1.16≥ Java 8能原版甚至使用 Java 21 启动也可能成功。
≤ 1.16.5≤ Java 16基于模组普遍需求,推荐使用 Java 11。
≥ 1.17≥ Java 16
≤ 1.17.1≤ Java 17推荐使用 Java 16。
≥ 1.18≥ Java 17
≤ 1.20.4≤ Java 18推荐使用 Java 17。
≥ 1.20.5*≥ Java 21推荐使用 Java 21。

Java 版本与游戏版本不匹配,并不一定会引起报错。在确认崩溃是否由 Java 问题引起前,需要引入一个概念:类文件版本号 (Class File Version)。对于 Java 6 及以上的 Java 版本,其对应的类文件版本号等于 Java 版本号 + 44,如:

类文件版本号Java 版本
52Java 8 (Java 1.8)
55Java 11
60Java 16
61Java 17
65Java 21

在崩溃信息中的 minecraft.log (即“控制台输出”),如下内容通常暗示了 Java 版本问题:

1. 找不到 Java 基础库的类

text
org.spongepowered.asm.mixin.throwables.ClassMetadataNotFoundException: java.util.Objects
org.spongepowered.asm.mixin.throwables.ClassMetadataNotFoundException: java.lang.Float
org.spongepowered.asm.mixin.throwables.ClassMetadataNotFoundException: java.util.function.Supplier

2. 不支持的类文件主版本

text
java.lang.IllegalArgumentException: Unsupported class file major version 65 (即,Java 21 无法启动当前版本)
has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0 (即,需要使用 Java 21 启动)

3. 不兼容的内部库类型转换

text
class jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to class java.net.URLClassLoader

4. 非法的访问

text
class net.xiaoyu233.fml.FishModLoader cannot access class com.sun.java.swing.plaf.windows.LookAndFeel

5. 需要 Legacy Java Fixer

text
[16:00:17] [main/ERROR] Unable to launch
java.lang.reflect.InvocationTargetException: null
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.9.jar:?]

这个问题很有趣,事实上是一个 FML 的 bug。在 launchwrapper 对所有 tweaker 进行处理的过程中,FML 进行了 tweaker 的不适宜的排序,使得 tweaker 的容器是否发生了改变(由于 Java 8 会检测容器是否发生改变并修复此修改(线程安全),而旧版则不会,因此崩溃发生了)。
解决方法也很简单,安装 Legacy Java Fixer 模组即可。这个模组将新版本 FML 的 tweaker 排序方式移植到了旧版,使得旧版仍然可以使用 Java 8 启动游戏。

6. 其它明示

text
This pack requires Java 11 or older but you appear to be using Java 17. (请使用 Java 11 而不是 Java 17 启动)  
The requested compatibility level JAVA_21 could not be set. (请使用 Java 21 启动)  
'Java HotSpot(TM) 64-Bit Server VM' (java) 8 替换为 21 及以上版本 (Fabric 的依赖检查)

7. 一个另类的情况

text
Method 'xxx' must be interfaceMethodref/Methodref

此问题具体归结到“Java 问题”或是“模组间版本不匹配”中。其原因是,该玩家使用了 1605.3.7 版本的 FTBQuests 和 1.16.5-3.67.6 版本的 PMMO。后者联动了 1605.3.3 的 FTBQuests。而在 1605.3.4 版本中,FTBQuests 经历了一次修改,将 TaskTypes 类从 class 修改为了 interface。改变了 register 函数在常量池的存放标签。
对于 Java 11,虚拟机会忠实地从常量池中寻找标签为 CONSTANT_Methodref_info 的类静态函数 register,而事实上这个函数在常量池中的标签是 CONSTANT_InterfaceMethodref_info,因而发生了崩溃。而用 Java 8 会忽略这一区别,使得两个不匹配的模组仍然可以正常运行。但最好的解决方法仍然是升级 FTBQuests 到 3.4 版以上。

2、依赖问题 (缺前置、版本不匹配)

因为模组的前置模组没有安装,或是二者版本不匹配导致的崩溃。这类崩溃通常有以下三个特点:

  1. 崩溃通常不会发生在游戏阶段,而是加载阶段。
  2. 模组加载器很可能会给出一个提示界面。
  3. 如果没有提示界面,日志中抛出的异常往往是 java.lang.ClassNotFoundException (如果在 mixin 环境中抛出,则是 org.spongepowered.asm.mixin.throwables.ClassMetadataNotFoundException)。

这类崩溃问题还有一些需要注意的点:

  1. 分析报告时,这个问题是是优先排查的。 在 Forge 和 NeoForge 中,如果存在依赖问题,后续的事件 (Event) 都会被拒绝发送,模组加载环境就已经被彻底破坏了,其余信息都是垃圾信息。
  2. 对于在加载阶段发生的依赖问题,在 Forge 和 NeoForge 中,往往会产生一个 fml 的 crash report(当然也有例外,如上例 Oculus 报错,会产生主例的 crash report 而不是 fml 的)。
  3. 有少数依赖问题发生在游戏阶段,但核心异常仍然是 ClassNotFoundException (或 ClassMetadataNotFoundException)。
  4. 由于 minecraft.log 只记录了最后 1000 行,依赖问题的核心指证可能已经被刷上去了。因此推荐检查 latest.log

典型案例

1. 高版本 Forge 的常见缺前置问题

如永恒枪械工坊 (tac) 缺失前置 MrCrayfish 的 Framework (framework) :

text
[17:32:22] [main/ERROR]: Missing or unsupported mandatory dependencies:
    Mod ID: 'framework', Requested by: 'tac', Expected range: '[0.5.3,)', Actual version: '[MISSING]'

2. 低版本 Forge 的常见缺前置问题

如火影忍者 (narutomod) 的四个附属被安装了,但核心模组缺失。此外还缺少前置帕秋莉手册 (patchouli):

text
[17:25:05] [main/FATAL]: net.minecraftforge.fml.common.MissingModsException: Mod anbubingobook (Anbu Bingo Book) requires [patchouli, narutomod]
Missing Mods:
    narutomod
    patchouli

3. 未在模组作者控制范围内的依赖问题

通常是兼容性不高的作者不允许将依赖声明在元信息中,或有前置模组大幅度地修改了 API 导致的版本不匹配。

  • 如雪中人 (man) 缺失前置 gecko 的动画渲染引擎 (geckolib):

    text
    java.lang.NoClassDefFoundError: software/bernie/geckolib/animatable/GeoEntity
  • 如机械动力 (create) 与机械动力:黄铜魔咒 (create_brass_coated) 版本不匹配:

    text
    java.lang.NoSuchMethodError: 'com.simibubi.create.content.contraptions.bearing.BearingBlock com.simibubi.create.Create.brassCased(java.lang.String, com.simibubi.create.foundation.data.BlockBuilder$RenderType, com.simibubi.create.foundation.block.IBE, com.tterrag.registrate.util.entry.BlockEntry)'
  • 如桌上工艺 (table_top_craft) 与光影加载器 (oculus) 版本不匹配,后者高版本将包名从 net.coderbot.iris.Iris 改成了 net.irisshaders.iris.Iris

    text
    java.lang.NoClassDefFoundError: net/coderbot/iris/Iris

4. Fabric 的常见缺前置问题

由于使用了自然语言,通俗易懂,因此不过多解释。

text
[14:55:23] [main/ERROR] Incompatible mod set!
    - mod 'fabric-api' (fabric) 0.43.1 is missing!
        - mod 'fabric' (fabricloader) 0.15.11 requires version 0.44.0 or later of fabric-api, which is missing!

解决方法很简单:安装前置,或将不匹配的两个 mod 都升级到最新版本。
如果升级后不匹配的两个 mod 都已经是最新版,请将作为前置的一方从最新版开始逐一降级版本尝试能否成功。
最好,最好查看二者的 Github 仓库,从 build.gradlegradle.properties 中找到二者代码层面发生链接的确切版本。

3、模组报错

当一个模组的代码存在潜在问题时,在玩家进行特定操作,或是在某个特定环境下会发生报错。
模组报错发生时,玩家的行为对崩溃没有任何责任。如果可以,请确保模组是最新版本后,向模组作者反馈。
对于玩家而言,如果一个 mod 必定报错,可以考虑将其升级到最新版本,或禁用。

模组报错常见的情形

  1. 报错常常发生在游戏阶段,有时也发生在加载阶段。 由于大多数模组作者都会在发布之前测试自己的模组,因此加载阶段的报错往往包括:
    并发问题:模组作者未考虑加载器的多线程加载策略,使用了线程不安全的方法修改容器,导致 ConcurrentModificationExceptionIndexOutOfBoundsException。这种问题一般很难复现,通常重启游戏就能避免。

  2. 配置文件错误引起的崩溃:此问题应回归到“配置文件损坏”中,但其表现和模组报错无异,具体情况请自行判断。

  3. 模组报错往往出现在调用栈的最浅几层
    如,凡家物语(mca)的除零错误:

    text
    java.lang.ArithmeticException: / by zero
        at net.minecraft.world.entity.ai.village.VillageSiege.tick(VillageSiege.java:628)

    有时未必在顶层,但因为错误地传递了参数而报错:

    text
    java.lang.IllegalArgumentException: Bound must be positive
        at java.util.Random.nextInt(Random.java:388)
        at twilightforest.world.components.StructureTFComponent.generateBox(StructureTFComponent.java:422)
  4. Mixin 注入引发的报错:报错模组可能使用了 mixin 技术向原版的函数中“注入”(inject)了一个函数,而调用栈顶是原版函数。此时注入函数的函数名基本都会符合这个模式:handler$xxx000$methodName
    如,梦幻方块效果(fbp)注入了 ParticleEngine 类的函数引发的报错:

    text
    java.lang.NullPointerException: Cannot read field "fbp_102032_because" because "original" is null
        at com.fbp.mixins.client.MixinParticleEngine.handler$zcc000$finishParticle(MixinParticleEngine.java:806)

4、模组冲突

有时一个模组单独运行时正常,和其它模组一起运行时则会报错,甚至在加载阶段就崩溃。此时则是发生了模组冲突。
如果两个 mod 发生冲突,且双方作者对此次冲突并不知情或尚未解决,可以考虑禁用其中一个。

Mixin 冲突原理

开发者可以使用 mixin 技术,通过向指定原版类中的函数进行注入(inject)重定向(redirect)、**整体重写(overwrite)**等操作。

  • 注入 (Inject):在一个原生逻辑流中加入新的逻辑。
  • 重定向 (Redirect):将一个原生函数调用替换为自己的函数。
  • 重写 (Overwrite):完全用自己的函数替换掉原生函数。

如果一个模组重定向重写了某个函数,另一个模组对该函数的注入点就会失效,从而引发冲突。
同样,多个模组重定向重写同一个函数也会引发冲突。

模组冲突的例子

1. Overwrite 冲突

Minecraft Forge 1.19.2,物品物理掉落(itemphysic)莱特兰-符文(l2complements) 冲突。

text
Caused by: org.spongepowered.asm.mixin.injection.throwables.InjectionError: LVT in net/minecraft/world/entity/item/ItemEntity::hurt has incompatible changes at opcode 100 in callback l2complements.mixins.json:ItemEntityMixin->l2c_hurt->@Inject.

其成因是,itemphysic 使用了重写(Overwrite)的方式将 ItemEntity 的整个 hurt 函数彻底修改,导致 l2complements 无法找到注入点。

2. Fabric 中的隐性冲突

Minecraft Fabric 1.20.1,地毯(carpet) 模组存在可疑冲突,但日志里并没有指示冲突的另一方。

text
Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered
    at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:392)

诊断步骤

  1. 在「Java 虚拟机参数」里添加 -Dmixin.dumpTargetOnFailure=true
  2. 重启游戏,崩溃后会在游戏目录生成一个 .mixin.out 文件夹,里面有转换失败的类文件(如 class_761.class)。
  3. 反编译 .mixin.out 里的类文件,和 carpet 模组 jar 包中对应的 mixin 文件(如 LevelRenderer_pausedShakeMixin.class)。
  4. 通过分析代码,可以发现 carpet 的注入点被另一个模组的 redirect 拔掉了。
  5. 搜索 redirect 函数名(如 redirect$zbc000$iris$$skipRenderEntities),可以发现冲突方是 Iris 光影加载器(iris)

3. 继承关系导致的冲突

有些模组继承了原版的类并派生了新的类,并“默认”其它模组不会存在这种继承情况。这很难被界定为单一模组的报错,还是模组之间存在冲突。如植物魔法(botania)应用能源 2(appliedenergistics2) 的冲突。

text
java.lang.ClassCastException: class appeng.crafting.CraftingPlan cannot be cast to class vazkii.botania.common.crafting.CraftingPlan (appeng.crafting.CraftingPlan and vazkii.botania.common.crafting.CraftingPlan are in unnamed module of loader 'TRANSFORMER' @1fa4e7f)

4. 地物顺序循环(Feature Order Cycle)

通常由于两个以上的模组向两个以上群系的同一个生成步骤中添加了不同的地物生成,导致世界生成时无法对地物进行拓扑排序。此时需要安装**氰化物(Cyanide)**模组辅助诊断具体是哪几个地物或模组发生了冲突。

5、Java 虚拟机错误

有些报错,日志中并没有给出任何异常,游戏突然中断,同时游戏目录中会出现一个 hs_err_pidXXXX.log 格式的 JVM 崩溃日志文件。这便是 Java 虚拟机(JVM)错误
这类问题有一个共同的特点:它们往往和游戏本身(包括 Java、模组、配置等)无关,使用不同的设备往往无法复现。
这类问题通常可以分为:

  • 虚拟内存问题
  • 驱动/硬件问题
  • C2 编译器问题
  • 模组 native 方法报错
  • Mac 系统问题

诊断分析时,先看崩溃代码,再看报错线程和原生帧,最后再分析日志中的其它信息。

虚拟内存问题

症状:崩溃代码通常是 EXCEPTION_ACCESS_VIOLATION (访问无效内存) 或 Out of Memory Errorminecraft.log 中可能出现 GL_OUT_OF_MEMORY 或“页面文件太小”的提示。
原因:物理内存 + 虚拟内存(页面文件)不足。

解决方法:增加虚拟内存。

  1. 在「此电脑」右键 ->「属性」->「高级系统设置」。
  2. 在「高级」标签页 ->「性能」的「设置」->「高级」标签页 ->「虚拟内存」的「更改」。
  3. 取消“自动管理所有驱动器的分页文件大小”。
  4. 选择一个剩余空间大的盘,选择“自定义大小”,将初始大小和最大值都设为物理内存的 1.5 到 2.0 倍(例如,16GB 内存可设置为 24000MB)。
  5. 点击“设置”并确定,然后重启电脑。
  6. 如果问题依旧,可尝试通过修改注册表 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Memory Management 下的 PagefileOnOsVolume 值为 0

驱动/硬件问题

症状:崩溃代码通常是 EXCEPTION_ACCESS_VIOLATION。报错线程通常是渲染线程(Render Thread)或客户端线程(Client Thread)。原生帧(native frame)中出现显卡驱动相关的 .dll 文件,如 atio6axx.dll (AMD), ig7icd64.dll (Intel), nvoglv64.dll (NVIDIA) 等。
原因:显卡驱动过时、不兼容或已损坏;也可能是内存超频等硬件问题。

解决方法

  1. 更新显卡驱动:去显卡官网(NVIDIA/AMD/Intel)下载并安装最新的、与你的操作系统和显卡型号匹配的驱动。
  2. 设置首选图形处理器:确保游戏使用的是独立显卡而不是核心显卡。
  3. 使用软渲染:如果驱动已是最新但问题依旧,可以在启动器设置中将渲染方式改为 CPU 软渲染(会牺牲性能)。
  4. 检查硬件:关闭内存超频(XMP),检查硬件是否稳固。

C2 编译器问题

症状:崩溃代码为 EXCEPTION_ACCESS_VIOLATION,报错线程为 C2 CompilerThread
原因:Java JIT(Just-In-Time)的 C2 编译器在某些极端情况下不稳定。
解决方法:禁用 C2 编译器。在「Java 虚拟机参数」中添加 -XX:TieredStopAtLevel=3

模组 native 方法报错

症状:JVM 崩溃,但通过分析调用栈可以追溯到某个模组在调用本地(native)代码。
原因:模组自身的 Bug。
解决方法:按“模组报错”处理,更新或禁用该模组。

Mac 系统问题

症状:表现与其它几种情况相似,但崩溃代码和原生帧千奇百怪。

解决方法

  1. 升级 macOS 系统。
  2. 禁用 OptiFine、Iris、Oculus 等与特殊渲染相关的模组。
  3. 更换为 Windows 设备。

6、Unicode 问题

此类问题仅仅会在加载阶段之前产生,其成因是,由于玩家在游戏路径中使用了非英文的 Unicode 字符(如中文、日文、韩文、特殊符号),使得程序无法找到游戏目录。

  1. 更换 Java 版本:卸载 Oracle 的 Java 8u411 和 Java 8u421,这两个版本已知存在此问题。可更换为其它版本,如 BellSoft 的 Java 8u422。
  2. 修改系统区域设置
    在 Windows 「控制面板」 -> 「时钟和区域」 -> 「区域」 -> 「管理」里点击「更改系统区域设置」。
    取消勾选 “Beta 版:使用 Unicode UTF-8 提供全球语言支持”。
    点击确定并重启电脑。
  3. 修改路径名:将游戏路径中所有非英文字符的文件夹名修改为纯英文/数字/下划线。
  4. 重装游戏:如果以上方法均无效,说明游戏核心文件可能已损坏,请在启动器中重装游戏版本。

7、配置文件损坏

此类问题通常在游戏加载或世界加载阶段报错。调用栈信息中通常含有 config 字样,并可能指出损坏配置文件对应的模组。
如果配置文件损坏是玩家手动修改导致的,请检查修改内容是否合法。如果不是,可能是由于强行退出游戏等原因。
解决方法很简单:将损坏的配置文件直接删除,下一次游戏启动时模组会自动创建新的默认配置文件。

一个另类的情况

SerializationIsBad 模组的默认配置文件指向了一个来自外网的远程补丁,部分用户无法访问会导致报错。

text
[12:41:17] [main/FATAL]: Using local file config as a fallback for the remote config, as it has failed.
java.lang.RuntimeException: An error occurred trying to configure the Minecraft@Home...

解决方法是使用代理、删除配置文件或禁用该模组。

8、模组文件损坏

有时因为下载问题或网络传输问题,下载好的模组 .jar 文件是损坏的,导致加载阶段出现 zip END header not found 错误。

  1. 手动排查:用压缩软件(如 7-Zip, WinRAR)尝试打开 mods 文件夹下的每一个 .jar 文件。如果无法打开或报错,则该文件已损坏。

  2. 脚本排查:对于模组数量较多的情况,可以在游戏根目录(.minecraft 目录)下运行以下 Python 脚本来快速定位损坏的模组文件。

    python
    import os
    import zipfile
    
    for root, dirs, files in os.walk(".", topdown=False):
      for f in files:
        if f.endswith(".jar"):
          try:
            file = zipfile.ZipFile(os.path.join(root, f), 'r')
            # Test the zip file to be sure
            if file.testzip() is not None:
                print(f"Bad CRC or file header on: {os.path.join(root, f)}")
          except zipfile.BadZipFile as e:
            print(f"BadZipFile error on: {os.path.join(root, f)}")
  3. 查看日志:有时模组加载器(如 Fabric Loader)会直接在日志中指出具体哪个模组文件损坏了。

    text
    Caused by: java.lang.RuntimeException: Error analyzing C:\Users\admin\Desktop\minecraft\versions\1.20.1\.minecraft\mods\larger-ore-veins-deluxe-1.2.2 (1).jar!
    ...
    Caused by: java.util.zip.ZipException: zip END header not found

找到损坏的模组后,将其删除并从可靠来源重新下载。

9、模组重复

玩家在 mods 文件夹中重复安装了同一个 mod 的相同或不同版本,导致加载时产生崩溃。

  • Forge 和 NeoForge 中,此问题较常见。
  • Fabric 通常会自动加载符合要求的版本,较少因此崩溃。

有时日志会直接指出重复的模组,有时则会因重复注入等原因崩溃。
常见的重复模组例子(通常是优化模组或 API 的不同分支):

  1. Embeddium (embeddium)、铷 (rubidium)、氙 (xenon)。
  2. 锂 (lithium)、镭 (radium)、金丝雀 (canary)。
  3. Curios API (curios)、Curios API Continuation (curios)、Adorned Curios (curios)。
  4. JEI 物品管理器 (jei)、REI Plugin Compatibilities (rei_plugin_compatibilities)。
  5. 玉 (jade) 和 那玩意是什么 (wthit)。

解决方法:删除重复的模组,只保留一个版本。

10、程序未响应与外部报错

此类问题的日志表现和 JVM 崩溃很相近,都是游戏进程被中断,日志“戛然而止”。但不同的是,minecraft.log 和控制台输出没有任何异常。这很可能是程序未响应(卡死)后被玩家或系统强行关闭。

诊断流程

  1. 检查外部报错:打开 Windows 的「事件查看器」 -> 「Windows 日志」 -> 「应用程序」,查找与 javaw.exe 相关的“错误”事件。如果存在,根据错误模块(如 lwjgl.dll)和异常代码进行处理(此例为显卡问题)。
  2. 分析程序未响应:如果事件查看器显示事件 ID 为 1002 (Application Hang),说明程序卡死。此时需要分析线程转储(Thread Dump)
    使用 HMCL 等启动器,在游戏卡住时,使用其“查看日志”或“导出运行栈”功能。
    分析导出的运行栈(thread-dump.txt),找到客户端主线程 (Render Thread) 和服务端主线程 (Server Thread)。
    查看它们的状态(WAITING, BLOCKED)以及在等待什么资源或锁。
    例如,客户端线程在等待服务端线程,而服务端线程正在被某个模组(如 Xaero's World Map)的文件读写操作阻塞,即可定位到是该模组导致了卡死。

常见卡死原因及解决方法

  • 模组请求外部资源:如 improvableskillsi18nupdate解决:使用代理,或升级/禁用模组。
  • 模组读取大文件:如 xaeroworldmap解决:耐心等待,或升级/禁用模组。
  • 游戏查询大型结构:如打开藏宝图。解决:耐心等待。
  • 处理大量实体:尤其是掉落物。解决:定期使用指令 /kill @e[type=item] 清理。
  • 显存/内存不足:导致 native 方法调用卡住。解决:升级显卡驱动,减少虚拟内存,或更换设备。

11、练习题

1. 一个惊变 100 天整合包的报错

text
Exception in thread "main" java.lang.RuntimeException: Failed to load FML config from E:\开始\游戏\我的世界\启动器\hmcl\.minecraft\versions\惊变100天_1.20.1(精简整合)\config\fml.toml
...
Caused by: com.electronwill.nightconfig.core.io.ParsingException: Not enough data available

2. 一个 1.20.1 自研枪械整合包的报错

text
Description: Moused-clicked event handler

java.lang.NoClassDefFoundError: Could not initialize class net.minecraft.sounds.SoundEvents_1969_IF
    at com.mrcrayfish.guns.client.sound.SoundPlayHandler.onMouseInput(SoundPlayHandler.java:62) ~[genshinstrument-1.20-1.20.1-4.0.2.jar%23272!/:1.20.1-4.0.2]
    at net.minecraft.client.MouseHandler.onPress(MouseHandler.java:86) ~[client-1.20.1-20230612.114412-srg.jar%23269!/:?]
    ...

3. 一个 1.20.2 单模组游戏的报错

text
[23:38:41] [Worker-Main-8/ERROR] [minecraft/Minecraft]: Caught exception during event FMLEnoconnogEvent dispatch for modid pokelucky
java.lang.NoClassDefFoundError: com/pixelmonmod/pixelmon/api/data/PixelmonPacket
    at pokelucky.pokelucky.setup.pokelucky.setup(pokelucky.java:18) ~[pokelucky-11.16.jar%23157!/:1.0.0]
    ...

4. 一个 1.16.5 宝石梦整合包的报错(文件太长,这里只保留首尾)

text
[21:20:19] [main/INFO] [cpw.mods.modlauncher.Launcher/MODLAUNCHER]: ModLauncher running: args [--username, ... ]
...
[21:20:20] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles$Lookup (java.lang.IllegalAccessError: class cpw.mods.modlauncher.SecureJarHandler$MaybeTrustedUrlConnection cannot access class java.lang.invoke.MethodHandles$Lookup (in module java.base) because module java.base does not export java.lang.invoke to unnamed module @65e52344)
[21:20:20] [main/WARN] [mixin/]: @Mixin target java.lang.invoke.MethodHandles$Lookup was not applied.
[21:20:20] [main/WARN] [mixin/]: Error loading class: java/lang/invoke/MethodHandles (java.lang.IllegalAccessError: class cpw.mods.modlauncher.SecureJarHandler$MaybeTrustedUrlConnection cannot access class java.lang.invoke.MethodHandles (in module java.base) because module java.base does not export java.lang.invoke to unnamed module @65e52344)
[main/INFO] [STDERR/]: [org.spongepowered.asm.mixin.transformer.MixinProcessor:applyMixins:1000]: org.spongepowered.asm.mixin.throwables.ClassMetadataNotFoundException: java.util.Objects

12、练习题答案

  1. 配置文件损坏。删除配置文件 E:\开始\游戏\我的世界\启动器\hmcl\.minecraft\versions\惊变100天_1.20.1(精简整合)\config\fml.toml

    Caused by: com.electronwill.nightconfig.core.io.ParsingException: Not enough data available

  2. 模组报错genshininstrument-1.20-1.20.1-4.0.2.jar 报错。

    at com.mrcrayfish.guns.client.sound.SoundPlayHandler.onMouseInput(...) ~[genshinstrument-1.20-1.20.1-4.0.2.jar...

  3. 依赖问题 (缺前置)pokelucky 模组缺少前置 pixelmon

    Caused by: java.lang.NoClassDefFoundError: com/pixelmonmod/pixelmon/api/data/PixelmonPacket

  4. Java 版本问题。需要使用 Java 11 启动游戏,而不是 Java 21。

    Class file major version 65 is not supported by this version (65 对应 Java 21) 且 ClassMetadataNotFoundException: java.util.Objects (低版本 Java 找不到高版本 Java 的基础类) 都指向了 Java 版本不兼容。

"Minecraft" is a trademark of Microsoft Corporation. This document is not affiliated with Microsoft Corporation.