简介
本模组修复了 Forge 1.6.1 ~ 1.7.2 版本无法使用 1.8.0_20 以上版本的 Java 启动游戏的问题。
该问题在 1.8 及以上版本的游戏中不复存在。对于 1.7.10,请使用版本在 1.7.10-10.13.1.1217 或以上的 Forge。
适用范围
如果你使用了高于 8u20 版本的 Java 并发生了如下崩溃,那么你可以通过安装这个模组来修复问题:
[00:00:00] [main/ERROR]: Unable to launch
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911) ~[?:1.8.0_412]
at java.util.ArrayList$Itr.remove(ArrayList.java:875) ~[?:1.8.0_412]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:117) [launchwrapper-1.9.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.9.jar:?]
作为另一种修复策略,你可以降低 Java 版本,但如果你使用低于这个版本的 Java(如 Java 7、Java 8u11 等)启动游戏,请不要安装这个模组——这同样会引起游戏崩溃(和狼人杀里被刀同守同救仍然会倒牌一样的道理)。
原理
Java 8u20 修改了 Collections.sort 的实现方法,不再统一使用数组缓冲,排序后重新赋值,而是委托到每个 List 实现的 sort 函数中执行——这一修改虽然兼容了曾经不能使用该函数排序的 CopyOnWriteArrayList 容器,但因为 ArrayList 等容器的 sort 方法会修改容器的 modCount 结构性修改计数器,使得在容器被迭代的过程中,调用该方法排序会抛出并发修改异常(Java 开发岗必背八股)。
本模组将 Java 8u20 以前的使用数组缓冲的排序方法封装成最高优先级的 tweaker,替换掉 FML 的直接调用 Collections.sort 的 tweaker,从而在保证正确性的前提下避免了并发修改异常的抛出。