java 7语言向后兼容性

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

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

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

javac -source 1.6 -target 1.6 MyJavaFile.java

当您尝试编译Java 7语言function(例如,多捕获)时,您将获得:

 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 7function的源代码)编译为Java 6兼容字节码。

如果使用Java 7编译它(没有-source-target标志),您将获得无法在

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

你不能将Java 7特性的源码编译成Java 6 .class,因为这样

 javac -source 1.7 -target 1.6 Test.java 

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