因此,我有一个ClassLoader
后代,该后代通过网络加载所需的类。如何正确处理瞬态错误(例如临时网络中断)或线程中断的超时?
这里的问题是,我唯一不能丢掉的loadClass()
是ClassNotFoundException
。似乎一旦抛出CNFE,JVM便不会重新尝试加载类,而是会从Java代码中触发NoClassDefFoundError
。
这是合乎逻辑的,但不能解决瞬态错误。如果我们从Class Loader中抛出CNFE,则意味着该类将永远不可用,并且代码也将无法正常运行,即使问题已解决且可以重试也可以加载类。类加载代码长时间等待是不希望的,而且并非总是可能。
更糟的是,类加载器可能会被中断。它将在网络操作等待时导致InterruptedException,这又将引发CNFE的抛出,再次导致无法使用的状态,即不会加载完美的类,并且永远也不会破坏代码。
这里是否有关于如何处理瞬时类加载失败的推荐解决方案?我希望代码一次获得ClassNoDefFoundError
,但是下次需要时重试。
基本上我有两个想法:
也许我什至错了,通常不应该每次都不去类加载器的情况下抛出JVM NoClassDefFoundError
?
答案 0 :(得分:0)
这里的问题是,我只能从loadClass()中抛出的唯一问题是 ClassNotFoundException
您是否尝试引发一些未经检查的异常?想知道虚拟机将如何处理。
我希望代码一次获得
ClassNoDefFoundError
但有一个 下次需要时重试
因此,只要有一个ClassDefNotFoundError
(请注意Error
后缀...),任意数量的线程在任意点中止,您就可以了。线程稍后重试类加载吗?
似乎ClassDefNotFoundError
的名字也被认为是不可恢复的,这对大多数应用程序来说都是有意义的。