java 7语言向后兼容性

时间:2013-06-18 11:54:29

标签: java backwards-compatibility

简短问题:如果我使用以前在Java 6中不可用的相对“次要”Java 7语言功能,例如try-muticatch块...这是否意味着我的程序将无法在具有JRE 6或JRE的计算机上运行5编译后安装为?如果这是正确的,是否可以快速生成JRE6 .jar可执行文件而无需更改Java 7源代码(顺便提一下,它将使用的唯一Java 7功能是try-multicatch块)?

2 个答案:

答案 0 :(得分:8)

你是对的。 Multi-catch是一种Java 7语言特性,无法将其编译为Java 6(或更早版本)JVM兼容字节码。

使用Java 7编译器,以下允许您编译Java 6兼容字节码:

javac -source 1.6 -target 1.6 MyJavaFile.java

当您尝试编译Java 7语言功能(例如,multi-catch)时,您将获得:

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

(有关warning含义的更多信息,请参阅: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - 这与此讨论没有关系)

如果您将-source标记更改为1.7,则会收到:

  

源版本1.7需要目标版本1.7

因为......您无法将Java 7源代码(例如具有Java 7功能的源代码)编译为Java 6兼容字节码。

如果使用Java 7编译它(没有-source-target标志),您将获得Java 7字节码,该字节码无法在< Java 7 JVM。如果您尝试这样做,您将收到一个错误,告诉您版本不匹配:

  

roach $ / Library / Java / Home / bin / java net.mostlyharmless.multicatch.App
  线程“main”中的异常java.lang.UnsupportedClassVersionError:   net / mostlyharmless / multicatch / App:不支持的major.minor版本   51.0

答案 1 :(得分:7)

您无法使用Java 7功能将源代码编译为Java 6 .class,因为这个

javac -source 1.7 -target 1.6 Test.java

产生source release 1.7 requires target release 1.7错误。这是因为1.7功能中的某些功能只能用于Java 7类。例如try-with-resources仅使用Throwable.addSuppressed方法,因为1.7