2011-12-22 46 views
7

什麼是java.lang.UnsupportedClassVersionError什麼是java.lang.UnsupportedClassVersionError?

我從doc閱讀:當Java虛擬機試圖讀取一個類文件,並確定文件的主輔版本號不受支持拋出,但不明白是什麼意思。

什麼是文件中的主要和次要版本

我發起了在別人的機器的應用程序時,以下異常被拋出:

Exception in thread "main" java.lang.UnsupportedClassVersionError: client (Unsupported major.minor version 51.0) 
    at java.lang.ClassLoader.defineClass0(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:539) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:251) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:55) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:194) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:187) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:289) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:235) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) 

雖然我的機器上運行良好。

回答

10

不同版本的JDK編譯器生成不同的類版本。例如,Java 1.4生成48.0,1.5生成49.0和1.6 50.0。

JVM通常能夠從JVM的「小於」本身加載類,但從不會更大。您可能試圖在1.5 JVM上使用爲1.6編譯的類,或類似的東西。

如果您有興趣,尋找課程版本的好工具是bcel。特別是,它有一套很好的螞蟻任務。

+0

可以使用'javap'(java中的內置反彙編程序)來檢查主版本和次版本。如果您想以編程方式執行此版本檢查,BCEL會更合適。 – peakit 2012-01-01 16:00:15

3

這意味着您的編譯器版本比您試圖運行類的jvm版本更新。降級您的機器的Java編譯器或升級另一臺機器的運行時jvm。

+1

還有第三個選項(對於大多數java編譯器)。你可以做一些類似於'javac -target 1.1'的東西,它可以從一個現代編譯器產生適合古代JVM的字節碼。沒有必要實際降級編譯器。 – emory 2011-12-22 14:38:20

+0

@ emory「1.1」代表什麼? – 2011-12-22 15:10:32

+1

@SuhailGupta在我的例子中,我有一個1.7編譯器,但我想在1.1 JVM上使用字節碼。更有可能你的情況,你有一個1.6編譯器,但想要在1.5 JVM上使用字節碼(如http://stackoverflow.com/a/8605030/348975) - 那麼你會使用'javac -target 1.5' – emory 2011-12-22 21:36:29

相關問題