可以在调用System.LoadLibrary时捕获UnsatisfiedLinkError以回退到另一个DLL吗?

Ste*_*ler 16 java

在启动时,我希望我的Java程序加载一个DLL,该DLL应该在java.library.path定义的路径上.但是,如果缺少该DLL,我希望我的程序回退到加载不同的DLL.如果找不到DLL文件,System.LoadLibrary会抛出UnsatisfiedLinkError.UnsatisfiedLinkError是Error的子类,而不是Exception的子类.很多评论都表明捕捉错误是不好的做法.这是一个可以做这样的事情的情况吗?

try
{
    System.loadLibrary("myLibrary");
}
catch (UnsatisfiedLinkError e)
{
    try
    {
        System.load(<a fully qualified path to my fall-back library>);
    }
    catch (UnsatisfiedLinkError e)
    {
        <report that even the fall-back library didn't load>;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*oni 16

在这种情况下,它是完全可以接受的.事实上,这是做你想做的事的唯一方法.

一般来说,捕获错误是不好的做法,因为没有什么可以从它们中恢复,之后应用程序可能处于不可预测的状态.例如,OutOfMemoryError意味着你的内存已经耗尽,你可以做的很少.StackOverflowError意味着你的调用堆栈已经变得太深,你也无法做很多事情.

  • 谢谢!这就是我从文档中收集的内容:错误往往意味着程序无法恢复.这似乎是一个奇怪的Throwable进入该类别.也就是说,它告诉我,UnsatisfiedLinkError不适合loadLibrary抛出.UnsatisfiedLinkError文档说,"如果Java虚拟机无法找到声明为native的方法的适当的本机语言定义,则会抛出",但loadLibrary doc说如果库不存在则会抛出UnsatisfiedLinkError.不太相同的东西,imho,因为它可能在那种情况下恢复. (2认同)