2013-06-18 43 views
8

Câu hỏi ngắn gọn: Nếu tôi sử dụng các tính năng ngôn ngữ Java 7 tương đối nhỏ trước đây không có trong Java 6, chẳng hạn như khối try-muticatch ... điều này có nghĩa là chương trình của tôi sẽ không chạy trong máy với JRE 6 hoặc JRE 5 được cài đặt sau khi được biên dịch không? Nếu đó là chính xác, có cách nào nhanh chóng để tạo ra một tệp thực thi JRE6 .jar mà không thay đổi mã nguồn Java 7 (mà, bằng cách này, tính năng Java 7 duy nhất nó sẽ sử dụng là khối try-multicatch)?java 7 ngôn ngữ tương thích ngược

Trả lời

8

Bạn là chính xác. Multi-catch là một tính năng ngôn ngữ Java 7 và không có cách nào để biên dịch nó sang Java bytecode tương thích với Java 6 (hoặc cũ hơn).

Sử dụng một trình biên dịch Java 7, sau đây cho phép bạn biên dịch Java 6 bytecode tương thích:

javac -source 1.6 -target 1.6 MyJavaFile.java

Khi bạn cố gắng để biên dịch Java 7 tính năng ngôn ngữ (multi-catch, ví dụ), bạn sẽ nhận được:

roach$ javac -source 1.6 -target 1.6 test.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.6 
test.java:9: error: multi-catch statement is not supported in -source 1.6 
    } catch (NullPointerException | BufferOverflowException ex) {} 
           ^
    (use -source 7 or higher to enable multi-catch statement) 
1 error 
1 warning 

(để biết thêm về những gì mà warning phương tiện, xem: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - nó không relavent cuộc thảo luận này)

012.351.

Nếu bạn thay đổi -source cờ để 1.7 bạn sẽ nhận được:

source release 1.7 requires target release 1.7

... Bởi vì bạn không thể biên dịch Java 7 nguồn (ví dụ nguồn có các tính năng Java 7) tới bytecode tương thích Java 6.

Nếu bạn biên dịch nó bằng Java 7 (không có cờ -source hoặc -target), bạn sẽ nhận được mã Java 7 bytecode không thể chạy trên một JVM Java 7 <. Và nếu bạn cố gắng làm như vậy, bạn sẽ nhận được thông báo lỗi cho bạn biết các phiên bản không khớp:

roach$ /Library/Java/Home/bin/java net.mostlyharmless.multicatch.App
Exception in thread "main" java.lang.UnsupportedClassVersionError: net/mostlyharmless/multicatch/App : Unsupported major.minor version 51.0

7

Bạn không thể biên dịch mã nguồn với Java 7 tính năng vào Java 6 .class vì đây

javac -source 1.7 -target 1.6 Test.java 

sản xuất source release 1.7 requires target release 1.7 lỗi. Điều này là do một số tính năng 1.7 chỉ có thể làm việc với các lớp Java 7. Ví dụ: try-with-resources sử dụng phương pháp Throwable.addSuppressed chỉ có sẵn từ 1.7

Các vấn đề liên quan