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编译它(没有 roach $ / Library / Java / Home / bin / java net.mostlyharmless.multicatch.App -source
或-target
标志),您将获得无法在
线程“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之后可用