この種のエラーに関する問題を理解しています。私のプログラムが実行中のJavaバージョンを検出し、スレッド「メイン」bla bla blaメッセージのやや不可解な「例外」ではなく、よりエレガントなメッセージをユーザーに提供できるようにしたいと思います。実行中のJavaバージョンを検出できますが、プログラムがチェックコードを実行するのに十分な距離に達していないようです。
要するに...私のプログラムはどのようにしてこのエラーをキャッチし、メッセージを表示して正常に終了することができますか?
この種のエラーに関する問題を理解しています。私のプログラムが実行中のJavaバージョンを検出し、スレッド「メイン」bla bla blaメッセージのやや不可解な「例外」ではなく、よりエレガントなメッセージをユーザーに提供できるようにしたいと思います。実行中のJavaバージョンを検出できますが、プログラムがチェックコードを実行するのに十分な距離に達していないようです。
要するに...私のプログラムはどのようにしてこのエラーをキャッチし、メッセージを表示して正常に終了することができますか?
ですjava.lang.UnsupportedClassVersionError
。これは (明らかError
に Java のクラスの子孫) であり、サブクラスをサブクラスjava.lang.ClassFormatError
化しますjava.lang.LinkageError
(これは ) の直接のサブクラスですjava.lang.Error
)。このエラーは、JVM (Java 仮想マシン) がクラス ファイルを読み取ろうとして、特定のクラス ファイルのメジャーおよびマイナー バージョン番号がサポートされていないことが判明した場合にスローされます。これは、クラス ファイルの実行に使用される JVM バージョンよりも高いバージョンの Java コンパイラを使用してクラス ファイルを生成する場合に発生します。
これは非常に理解しやすいです。コンパイラは、コンパイルされたクラス ファイルを実行するために使用される JVM のバージョンについて、コンパイル時にどのように情報を取得できますか? できませんよね?他のエラーも同様です。これが、すべてのエラーがチェックされていない理由です。
なぜユーザーにこのエラー メッセージを表示する機会を与えるのか! これは、あなたが言うように、ソースコードのコンパイルに使用したコンパイラの対応するバージョンよりも古いバージョンの JVM を使用してクラスファイルを実行している場合にのみ出力されます。さて、なぜあなたはそれをするのですか?
この例外は からスローされるため、そのようなエラーをバックトレースClassLoader
する独自のバージョンを作成することをお勧めします。ClassLoader
UPD:より具体的には、 method をオーバーライドしてdefineClass
、そのような例外をキャッチし、便利な方法でラップすることができます。
UPD-2:コメントで述べたように、またus2012が私の考えを再定式化したように (彼のおかげで)、ユーザーの VM バージョンよりも低いことが保証されているクラスローダーを使用してコンパイルする必要があります。-target