4

Windows ユーザーから次のスタック トレースを頻繁に取得します。

java.lang.UnsatisfiedLinkError: sun.awt.image.ImageRepresentation.setBytePixels(IIII[BIILsun/awt/image/ByteComponentRaster;I)V
    at sun.awt.image.ImageRepresentation.setBytePixels(Native Method)
    at sun.awt.image.ImageRepresentation.setPixels(Unknown Source)
    at sun.awt.image.ImageDecoder.setPixels(Unknown Source)
    at sun.awt.image.GifImageDecoder.sendPixels(Unknown Source)
    at sun.awt.image.GifImageDecoder.parseImage(Native Method)
    at sun.awt.image.GifImageDecoder.readImage(Unknown Source)
    at sun.awt.image.GifImageDecoder.produceImage(Unknown Source)
    at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    at sun.awt.image.ImageFetcher.run(Unknown Source)

これは、ユーザーが Java をアップグレードした後、最初に再起動せずにアプリを実行しようとしたときに発生します。どうやら Java をアップグレードするには (Windows の他のすべてと同様に) 使用可能な状態に戻すためにマシンを再起動する必要があります。

コール スタックにコードがないため、これはキャッチできる例外ではありません。からの例外を処理できますThread.UncaughtExceptionHandler。これが現在行っていることです。

代わりに、この例外を直接発生させてキャッチするか、他のチェックを行うことにより、アップグレード後に再起動が必要な状態にあるかどうかを起動時にチェックする方法が必要です。(現在のところ、これを引き起こす原因さえわかりません...) どうすればそれができるか知っている人はいますか?

4

2 に答える 2

2

運が悪いのではないかと心配しています。再起動が必要であることを OS に知らせるためのレジストリ エントリが存在する場合がありますが、これはインストーラが必要とする場合にのみ設定されます。その他の唯一の例外は、インストーラーによって置き換えられる DLL を使用するコードがある場合です。インストール プロセスにより、OS から「完了するには再起動が必要です」というダイアログ ボックスが表示されます。

Java の自動更新でマシンの再起動が必要になったことはまだありません。OS が「再起動が必要」な状態にならない場合は、何も見つけて検査する必要はありません。できる最善のことは、例外をキャッチして適切なエラー メッセージを表示することです。私はこの問題をバグとして Oracle に報告します (それに慣れるのは難しいでしょう)。おそらく、将来のアップデートは適切に動作するでしょう。

于 2010-11-04T22:09:57.103 に答える
0

例外が発生する前に何らかのコードを呼び出せることが保証されている場合は、手動で Java バージョン チェックを行うことを検討することをお勧めします。最後のアップグレードがこのようなクラッシュを引き起こすかどうかはわかりませんが、最後の実行以降に Java バージョンが変更されたかどうかはいつでも確認できます。簡単な方法でどこかに保管しておきましょう。

その後、Java のバージョンが変更された場合は、起動するたびに、「Java が更新されたため、アプリケーションが正しく動作しない可能性があります」という情報が表示されます。再起動をお勧めします」および/または続行を中止します。

何かのようなもの:

public static void main(String[] argv) {
  String lastJVM = retrieveJVMversionFromLastExecution();
  String currentJVM = System.getProperty("java.version");
  if (!currentJVM.equals(lastJVM)) {
     throw new RuntimeException("New JVM. Please reboot");
  }  else {
     storeJVMversionPersistently(currentJVM);
  }     

  // ... your normal operation

}
于 2010-11-05T10:51:14.307 に答える