ClassNotFoundException被检查为异常的原因

Raf*_*ael 12 java exception classnotfoundexception

ClassNotFoundException检查异常背后的原因是什么?

我一直在猜测和谷歌搜索试图理解为什么认为类没有被发现作为检查异常,因为我的所有想法告诉我它应该是未经检查的.

Mik*_*uel 7

当接收器可以/应该采取一些有意义的操作来在运行时纠正问题时,通常会检查异常.

未经检查的例外 - 争议说:

这是底线指南:如果可以合理地期望客户端从异常中恢复,则将其作为已检查的异常.如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常.

最常见的ClassNotFoundExceptions 源代码是

classLoader.loadClass(className);
Run Code Online (Sandbox Code Playgroud)

反射性加载基于在配置文件中,串行输入,或远程过程调用发现了一个名称的类.

与此形成鲜明对比的是,ClassNotFoundError这些程序通常是由与JVM的链接器在运行时无法找到的其他类静态编译的程序产生的.

反射用例(已检查)与无法链接静态编译代码(运行时错误)的区别是什么?


上下文

反射:调用者知道字符串的来源以及尝试加载的原因.

静态:调用者只是尝试使用编译时可用的类.没有上下文可用.

复苏

反射:调用者可以故障转移到不同的实现或尝试默认策略.

静态:Java语言没有明确支持替换不同的链接点.

改写

反思:来电要经常错误转换为不同的种类,像
一个IOException失败反序列化.

静态:如果您的程序的一部分缺失,那么您不能依赖程序的必要部分来解释为什么其他部分缺少一个部分.


Ste*_*n C 5

ClassNotFoundException当您的代码调用Class.forName()无法解析为应用程序类路径上的类的类名时,抛出A (松散地说).它可能是应用程序用户提供的拼写错误的类名,因此可能有理由向用户报告,甚至可能使用更正的类名重试.换句话说,这可能是一个可恢复的错误......在某些情况下......所以你可以争辩说做出检查的决定是恰当的.

无论哪种方式:

  • 检查与未检查之间任何选择的"正确性"是一个问题意见,而非客观事实,
  • 在过去,Java设计者在某些情况下做出了错误的选择,并且
  • 一旦做出选择,就没有回头......没有破坏向后兼容性.

相比之下,如果你在类加载/初始化过程中遇到问题,你可能会得到一个NoClassDefFoundError.这绝对是不可恢复的.当发生这种情况时,您在JVM中存在一个或多个类,但无法初始化或实例化.(您还将看到NoClassDefFoundErrorJVM是否无法找到您指定的入口点类.但如果发生这种情况,您的应用程序甚至不会有机会尝试恢复......)