2011-12-22 17 views
7

java.lang.UnsupportedClassVersionError là gì?java.lang.UnsupportedClassVersionError là gì?

tôi đọc từ doc: Ném khi Java Virtual Machine cố gắng để đọc một tập tin lớp và xác định rằng những con số phiên bản lớn và nhỏ trong các tập tin không được hỗ trợ, nhưng không thể hiểu những gì hiện có nghĩa là gì.

phiên bản chính và nhỏ trong tệp là gì?

tôi đưa ra một ứng dụng trong máy người khác khi ngoại lệ sau đây đã được ném:

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) 

dù nó hoạt động tốt trên máy tính của tôi.

Trả lời

10

Các phiên bản khác nhau của trình biên dịch JDK tạo ra các phiên bản lớp khác nhau. Ví dụ, Java 1.4 tạo ra 48.0, 1.5 tạo ra 49.0 và 1.6 50.0.

Một JVM thường có thể tải các lớp từ JVM "nhỏ hơn" so với chính nó nhưng không bao giờ lớn hơn. Bạn có thể đang cố gắng sử dụng một lớp được biên dịch cho 1,6 trên một JVM 1,5, hoặc tương tự.

Một công cụ tốt để tìm phiên bản lớp là bcel nếu bạn quan tâm. Đặc biệt, nó có một tập hợp tốt đẹp của nhiệm vụ kiến.

+0

'javap' (bộ tách rời được tích hợp sẵn trong java) có thể được sử dụng để kiểm tra phiên bản chính và nhỏ. BCEL sẽ phù hợp hơn nếu bạn muốn thực hiện kiểm tra phiên bản này theo chương trình. – peakit

3

Điều đó có nghĩa là phiên bản trình biên dịch của bạn mới hơn phiên bản jvm nơi bạn đang cố chạy các lớp. Hạ cấp trình biên dịch java của máy hoặc nâng cấp jvm thời gian chạy của máy khác.

+1

Có một lựa chọn thứ ba (đối với hầu hết các trình biên dịch java). Bạn có thể làm một cái gì đó như 'javac –arget 1.1' mà sẽ từ một trình biên dịch hiện đại tạo ra bytecode phù hợp cho một JVM cổ đại. Không cần phải hạ cấp trình biên dịch. – emory

+0

@ emory '1.1' là gì? –

+1

@SuhailGupta Trong ví dụ của tôi, tôi có một trình biên dịch 1.7 nhưng tôi muốn sử dụng bytecode trên một JVM 1.1. Nhiều khả năng trong trường hợp của bạn, bạn có trình biên dịch 1.6 nhưng muốn sử dụng mã byte trên một JVM 1.5 (như trong http://stackoverflow.com/a/8605030/348975) - thì bạn sẽ sử dụng 'javac -target 1.5' – emory