如何处理瞬时类加载错误,例如线程中断

时间:2019-07-03 09:05:41

标签: java network-programming classloader interrupted-exception

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

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

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

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

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

基本上我有两个想法:

  • 一旦类加载器遭受瞬时错误,我们可以将其标记为错误,逐步淘汰其使用并创建一个新的类加载器,以重新尝试加载该类。
  • (甚至更多部分)我们可以从线程中清除中断标志,并等待类加载,然后在线程上恢复中断标志。

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

1 个答案:

答案 0 :(得分:0)

  

这里的问题是,我只能从loadClass()中抛出的唯一问题是   ClassNotFoundException

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

  

我希望代码一次获得ClassNoDefFoundError但有一个   下次需要时重试

因此,只要有一个ClassDefNotFoundError(请注意Error后缀...),任意数量的线程在任意点中止,您就可以了。线程稍后重试类加载吗?

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