首页 > 解决方案 > 如何处理瞬态类加载错误,例如线程中断

问题描述

所以我有一个ClassLoader通过网络加载所需类的后代。如何正确处理瞬态错误(例如临时网络中断)或线程中断的超时?

这里的问题是,我唯一能扔掉的loadClass()ClassNotFoundException. 一旦抛出 CNFE,JVM 似乎不会重新尝试加载类,而是会NoClassDefFoundError从 java 代码中触发。

这是合乎逻辑的,但不考虑瞬态错误。如果我们从类加载器中抛出 CNFE,则意味着该类将永远不可用并且代码将永远无法正常工作,即使问题已解决并且可以在重试时加载类。类加载代码的长时间等待是不可取的,而且并不总是可能的。

更糟糕的是,类加载器可能会被中断。它将在网络操作等待时导致 InterruptedException,这反过来又需要抛出 CNFE,再次导致无法使用的状态,即没有加载完美的类并且永远不会加载并且代码被破坏。

这里有关于如何处理瞬态类加载失败的推荐解决方案吗?我希望代码只获取ClassNoDefFoundError一次,但下次需要时重试。

基本上我有两个想法:

也许我什至错了,JVM通常不应该在NoClassDefFoundError每次不去类加载器的情况下抛出?

标签: javanetwork-programmingclassloaderinterrupted-exception

解决方案


这里的问题是,我唯一可以抛出 loadClass() 的是 ClassNotFoundException

您是否尝试过抛出一些未经检查的异常?想知道虚拟机将如何处理它。

我希望代码只获取ClassNoDefFoundError一次,但下次需要时重试

因此,只要其他线程稍后重试类加载,您会因为ClassDefNotFoundError(注意后缀...)而在任意点中止任意(数量)线程?Error

似乎 . ClassDefNotFoundError,也顾名思义,被认为是不可恢复的,这对大多数应用程序来说都是有意义的。


推荐阅读