我们经常从我们的 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 上的所有其他东西一样)重新启动机器以使事情恢复到可用状态。
这不是我们可以捕获的异常,因为我们的代码都没有在调用堆栈中。我们可以处理来自 a 的异常Thread.UncaughtExceptionHandler
,这就是我们现在正在做的事情。
相反,我们希望有一种方法可以在启动时检查我们是否处于升级后需要重新启动的状态,或者直接导致这个异常并捕获它,或者做一些其他的检查。(目前,我们甚至不知道是什么触发了这个......)有谁知道我们会怎么做?