java - 如何处理瞬态类加载错误,例如线程中断
问题描述
所以我有一个ClassLoader
通过网络加载所需类的后代。如何正确处理瞬态错误(例如临时网络中断)或线程中断的超时?
这里的问题是,我唯一能扔掉的loadClass()
是ClassNotFoundException
. 一旦抛出 CNFE,JVM 似乎不会重新尝试加载类,而是会NoClassDefFoundError
从 java 代码中触发。
这是合乎逻辑的,但不考虑瞬态错误。如果我们从类加载器中抛出 CNFE,则意味着该类将永远不可用并且代码将永远无法正常工作,即使问题已解决并且可以在重试时加载类。类加载代码的长时间等待是不可取的,而且并不总是可能的。
更糟糕的是,类加载器可能会被中断。它将在网络操作等待时导致 InterruptedException,这反过来又需要抛出 CNFE,再次导致无法使用的状态,即没有加载完美的类并且永远不会加载并且代码被破坏。
这里有关于如何处理瞬态类加载失败的推荐解决方案吗?我希望代码只获取ClassNoDefFoundError
一次,但下次需要时重试。
基本上我有两个想法:
- 我们可以将类加载器标记为坏,一旦它遭受瞬态错误,逐步停止使用并创建一个新的,它可能会重新尝试加载这个类。
- (甚至更部分)我们可以从线程中清除中断标志并等待类被加载,然后恢复线程上的中断标志。
也许我什至错了,JVM通常不应该在NoClassDefFoundError
每次不去类加载器的情况下抛出?
解决方案
这里的问题是,我唯一可以抛出 loadClass() 的是 ClassNotFoundException
您是否尝试过抛出一些未经检查的异常?想知道虚拟机将如何处理它。
我希望代码只获取
ClassNoDefFoundError
一次,但下次需要时重试
因此,只要其他线程稍后重试类加载,您会因为ClassDefNotFoundError
(注意后缀...)而在任意点中止任意(数量)线程?Error
似乎 . ClassDefNotFoundError
,也顾名思义,被认为是不可恢复的,这对大多数应用程序来说都是有意义的。
推荐阅读
- android-studio - 如何获取 gradle 任务的文件输出
- python - 随机模块不会随机播放加载到列表中的声音
- sql - 我想计算每 ROW_NUMBER 的最大金额
- mysql - 在同一个表中的多个线程上使用批量插入对 MySQL 进行基准测试
- node.js - 如何修复 AdonisJS 中的“无效 JSON,仅支持对象和数组”?
- bash - 为什么这个while循环在第一个循环之后不执行?
- ios - Nativescript-vue ios gridlayout 进入状态栏并在点击动作后向下移动
- javascript - 数字到等级字母
- google-maps - 如何修复 flutter_google_places_autocomplete.dart 的错误?
- php - 如何为 API Wrapper 和外部 API 编写 PHP 单元测试,方法是检查 Class 发出的请求是否符合模式