是什么导致 java.lang.Error 被抛出而没有任何细节?

What causes a java.lang.Error to be thrown with no details?

我偶尔会遇到 java.lang.Error(只是 Error,不是它的子类之一)被抛出,没有明显的来源,也没有详细信息。 Example:

java.lang.Error
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:211)
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:190)
    (rest of stack trace omitted)

这是LoadController.java:211:

FMLLog.log(modId, Level.TRACE, "Sending event %s to mod %s", stateEvent.getEventType(), modId);

另一个example:

java.lang.Error
    at java.util.ArrayList.indexOf(ArrayList.java:317)
    at java.util.ArrayList.contains(ArrayList.java:300)
    (rest of stack trace omitted)

这是ArrayList.java:317:

if (o.equals(elementData[i]))

(链接到完整的堆栈跟踪和来源。)我能想到的所有情况都会导致 Error 实际上会导致它的更具体的子类,and/or 一条包含详细信息的消息.是什么导致在这些地方只抛出一个 Error

这是我自己想出来的。 Minecraft 有一个服务器看门狗线程(net/minecraft/server/dedicated/ServerHangWatchdog.java 在 MCP 源代码中),它监视主服务器线程并在 运行 一个 tick 花费太长时间时导致这种情况发生。看起来它在这个堆栈跟踪中抛出错误的代码实际上与它完全无关。