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