2011-12-22 6 views
7

java.lang.UnsupportedClassVersionError nedir? java.lang.UnsupportedClassVersionError nedir?

Ben doc okunan: Java Virtual Machine, bir sınıf dosyası okumaya çalışır ve dosyadaki büyük ve küçük sürüm numaraları desteklenmez olduğunu belirlediğinde Atıldı , ama bu demek anlayamadık.

Dosyada büyük ve küçük sürümleri nedir?

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) 

benim makinede iyi çalıştı olsa: Aşağıdaki istisna atıldığında

başkasının makinede bir uygulama başlattı.

cevap

10

JDK derleyicisinin farklı sürümleri farklı sınıf sürümleri oluşturur. Örneğin, Java 1.4 48.0, 1.5, 49.0 ve 1.6 50.0 üretir. Bir JVM, genellikle JVM'lerden "kendinden daha az" olan sınıfları yükleyebilir ancak asla daha büyük olamaz. Muhtemelen 1.5 JVM'de ya da benzerlerinde 1.6 için derlenmiş bir sınıfı kullanmaya çalışıyorsunuzdur.

Sınıf sürümlerini bulmak için iyi bir araç, ilgileniyorsanız bcel. Özellikle, güzel bir karınca görevi görür.

+0

'javap' (java'da yerleşik disassembler) büyük ve küçük sürümleri kontrol etmek için kullanılabilir. Bu sürümün program aracılığıyla kontrol edilmesini istiyorsanız BCEL daha uygun olacaktır. – peakit

3

Bu, derleyici sürümünüzün, sınıfları çalıştırmaya çalıştığınız jvm sürümünden daha yeni olduğu anlamına gelir. Makinenizin java derleyicisini aşağı indirin veya diğer makinenin çalışma zamanı jvm'sini yükseltin.

+1

Üçüncü bir seçenek var (çoğu java derleyicisi için). Eski bir JVM için uygun olan modern bir derleyiciden bytecode üreten javac -target 1.1 gibi bir şey yapabilirsiniz. Derleyiciyi gerçekten düşürmeye gerek yoktur. – emory

+0

@ emory '1.1' neyi gösterir? –

+1

@SuhailGupta Örneğimde, bir 1.7 derleyicim var ancak bayt kodu 1.1 JVM'de kullanmak istiyorum. Durumunuzda büyük olasılıkla, bir 1.6 derleyici var ama bir 1.5 JVM üzerinde bayt kodu kullanmak istiyorsanız (http://stackoverflow.com/a/8605030/348975'te olduğu gibi) - daha sonra javac -target 1.5' kullanacaksınız – emory