8

簡単な質問: try-muticatch ブロックなど、以前は Java 6 で使用できなかった比較的「マイナーな」Java 7 言語機能を使用すると、JRE 6 または JRE 5 がインストールされたマシンでプログラムが実行されないことを意味しますか?そのままコンパイルされますか?それが正しければ、Java 7 ソース コードを変更せずに JRE6 .jar 実行可能ファイルを生成する簡単な方法はありますか (ちなみに、使用する Java 7 機能は try-multicatch ブロックだけです)。

4

2 に答える 2

8

あなたは正しいです。マルチキャッチは Java 7 言語機能であり、Java 6 (またはそれ以前) の JVM 互換バイトコードにコンパイルする方法はありません。

Java 7 コンパイラを使用すると、次のようにして Java 6 互換のバイトコードをコンパイルできます。

javac -source 1.6 -target 1.6 MyJavaFile.java

Java 7 言語機能 (マルチキャッチなど) をコンパイルしようとすると、次のようになります。

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 (no-sourceまたは-targetflag を指定) でコンパイルすると、Java 7 未満の JVM では実行できない Java 7 バイトコードが得られます。そうしようとすると、バージョンが一致しないというエラーが表示されます。

roach$ /Library/Java/Home/bin/java net.mostlyharmless.multicatch.App
スレッド「メイン」での例外 java.lang.UnsupportedClassVersionError: net/mostlyharmless/multicatch/App : サポートされていない major.minor バージョン 51.0

于 2013-06-18T13:12:56.403 に答える
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 クラスでのみ機能するためです。たとえば、1.7 以降でのみtry-with-resources使用可能なメソッドを使用しますThrowable.addSuppressed

于 2013-06-18T12:11:18.773 に答える