我理解有关此类错误的问题。我希望我的程序能够检测运行的java版本并向用户提供更优雅的消息,而不是有点神秘的“线程中的异常”主“bla bla bla”消息。我可以检测到运行的Java版本,但似乎我的程序永远不会运行我的检查代码。
简而言之......我的程序如何捕获此错误,显示消息并正常退出?
答案 0 :(得分:0)
所以它是java.lang.UnsupportedClassVersionError
。它(显然是Java中Error
类的后代)的子类java.lang.ClassFormatError
依次为java.lang.LinkageError
(它是java.lang.Error
的直接子类))。当JVM(Java虚拟机)尝试读取类文件并发现不支持特定类文件中的主要版本号和次要版本号时,会抛出此错误。如果使用更高版本的Java Compiler生成类文件而不是用于执行该类文件的JVM版本,则会发生这种情况。
这很容易理解 - 在编译时编译器如何获得有关使用哪个版本的JVM执行编译的类文件的信息?它不能,对吧?其他错误也是如此。这就是为什么所有错误都未被检查的原因。
为什么您甚至让用户有机会看到此错误消息!这就像你说的“隐秘”消息只会在你使用早期版本的JVM执行类文件时发出,而不是你用来编译源代码的相应版本的编译器。现在,你为什么要这样做?
答案 1 :(得分:0)
此异常从ClassLoader
开始抛出,因此我建议您编写自己的ClassLoader
版本,以便回溯此类错误。
UPD:更具体地说,您可以尝试覆盖方法defineClass
,捕获此类异常并以方便的方式将其包装。
UPD-2:正如我在评论中提到的那样,us2012重新阐述了我的想法(感谢他),你必须用{{1}编译你的类加载器保证低于用户的VM版本