背后的原因是什么? ClassNotFoundException
被检查的例外?
我一直在猜测和谷歌搜索试图理解为什么认为类没有被发现作为检查异常,因为我的所有想法告诉我它应该是未经检查的。
背后的原因是什么? ClassNotFoundException
被检查的例外?
我一直在猜测和谷歌搜索试图理解为什么认为类没有被发现作为检查异常,因为我的所有想法告诉我它应该是未经检查的。
当接收器可以/应该采取一些有意义的操作来在运行时纠正问题时,通常会检查异常。
未经检查的例外 - 争议 说:
这是底线指南:如果可以合理地期望客户端从异常中恢复,则将其作为已检查的异常。如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常。
最常见的来源 ClassNotFoundException
s就是代码
classLoader.loadClass(className);
那 反思 基于配置文件,序列化输入或远程过程调用中找到的名称加载类。
这与之形成鲜明对比 ClassNotFoundError
这通常是由一个程序产生的 静态 使用JVM的链接器在运行时找不到的其他类编译。
什么区别了 反光 用例(已选中)来自链接失败 静态 编译代码(运行时错误)?
反射:调用者知道字符串的来源以及尝试加载的原因。
静态:调用者只是尝试使用编译时可用的类。没有上下文可用。
反射:调用者可以故障转移到不同的实现或尝试默认策略。
静态:Java语言没有明确支持替换不同的链接点。
反射:调用者应该经常将错误转换为其他类型,例如
一个 IOException
未能反序列化。
静态的: 如果缺少部分程序,那么您不能依赖程序中必要的部分来解释为什么某个部分缺少其他部分。
一个 ClassNotFoundException
在您的代码调用时抛出 Class.forName()
在类名称上,无法解析为应用程序类路径上的类(松散地说)。它可能是应用程序用户提供的拼写错误的类名,因此可能有理由向用户报告,甚至可能使用更正的类名重试。换句话说就是这个 可以 是一个可恢复的错误......在某些情况下...所以你可以争辩说做出检查的决定是合适的。
无论哪种方式:
相比之下,如果在类加载/初始化过程中遇到问题,则可能会遇到问题 NoClassDefFoundError
。这绝对是不可恢复的。当发生这种情况时,您在JVM中存在一个或多个类,但无法初始化或实例化。 (你也会看到 NoClassDefFoundError
如果JVM未能找到您指定的入口点类。但如果发生这种情况,您的应用程序甚至不会有机会尝试恢复...)
当接收器可以/应该采取一些有意义的操作来在运行时纠正问题时,通常会检查异常。
未经检查的例外 - 争议 说:
这是底线指南:如果可以合理地期望客户端从异常中恢复,则将其作为已检查的异常。如果客户端无法执行任何操作以从异常中恢复,请将其设置为未经检查的异常。
最常见的来源 ClassNotFoundException
s就是代码
classLoader.loadClass(className);
那 反思 基于配置文件,序列化输入或远程过程调用中找到的名称加载类。
这与之形成鲜明对比 ClassNotFoundError
这通常是由一个程序产生的 静态 使用JVM的链接器在运行时找不到的其他类编译。
什么区别了 反光 用例(已选中)来自链接失败 静态 编译代码(运行时错误)?
反射:调用者知道字符串的来源以及尝试加载的原因。
静态:调用者只是尝试使用编译时可用的类。没有上下文可用。
反射:调用者可以故障转移到不同的实现或尝试默认策略。
静态:Java语言没有明确支持替换不同的链接点。
反射:调用者应该经常将错误转换为其他类型,例如
一个 IOException
未能反序列化。
静态的: 如果缺少部分程序,那么您不能依赖程序中必要的部分来解释为什么某个部分缺少其他部分。
一个 ClassNotFoundException
在您的代码调用时抛出 Class.forName()
在类名称上,无法解析为应用程序类路径上的类(松散地说)。它可能是应用程序用户提供的拼写错误的类名,因此可能有理由向用户报告,甚至可能使用更正的类名重试。换句话说就是这个 可以 是一个可恢复的错误......在某些情况下...所以你可以争辩说做出检查的决定是合适的。
无论哪种方式:
相比之下,如果在类加载/初始化过程中遇到问题,则可能会遇到问题 NoClassDefFoundError
。这绝对是不可恢复的。当发生这种情况时,您在JVM中存在一个或多个类,但无法初始化或实例化。 (你也会看到 NoClassDefFoundError
如果JVM未能找到您指定的入口点类。但如果发生这种情况,您的应用程序甚至不会有机会尝试恢复...)
未经检查的例外用于您的程序无法恢复的错误。已检查的例外是针对无效条件,您可以从中恢复。
据我所知,已检查异常的概念仅存在于Java中。
现在问题是程序可以从ClassNotFoundException中恢复吗?
大多数情况下,这是由Class.forName方法抛出的。这取决于你的程序,因此check和unchecked的概念有点随机,因为API开发人员应该知道我的程序是否可以从中恢复。当我在运行时需要该类并且无法处理时,这对我来说是未经检查的,但是当我向用户询问某些内容并根据此加载类时,输入可能是错误的,我可以向他询问其他内容。但大多数时候我会说你无法从中恢复过来,最好是不受控制。
但是在我看来,api和第三方使用了检查异常来提醒程序员这个问题可能发生并且需要考虑它。并且由于基于纯String加载某些内容可能会失败并且与整个Java静态类型语言概念不兼容,因此将异常标记为已检查,因此提醒您破坏静态安全性。不过这只是我的意见。
最后,由例外的开发者做出决定,他可能是错的或正确的,或者可能考虑其他一些原因,如我。