Java-捕获System.load()错误

Java-捕获System.load()错误,java,load,java-native-interface,Java,Load,Java Native Interface,我的主要观点是: LoadBinaries(): 公共静态布尔加载二进制文件(){ 字符串os=System.getProperty(“os.name”).toLowerCase(); ArrayList bin=新的ArrayList(); 如果(os.indexOf(“windows 7”)>=0 | | os.indexOf(“windows vista”)>=0){ add(“/nm/metadata/bin/win/libcurld.dll”); 添加(“/nm/metadata/bi

我的主要观点是:

LoadBinaries():

公共静态布尔加载二进制文件(){
字符串os=System.getProperty(“os.name”).toLowerCase();
ArrayList bin=新的ArrayList();
如果(os.indexOf(“windows 7”)>=0 | | os.indexOf(“windows vista”)>=0){
add(“/nm/metadata/bin/win/libcurld.dll”);
添加(“/nm/metadata/bin/win/libfftw3f-3.dll”);
add(“/nm/metadata/bin/win/libmad.dll”);
add(“/nm/metadata/bin/win/libsamplerate.dll”);
添加(“/nm/metadata/bin/win/seven/mylib.dll”);
}
如果(os.indexOf(“windows xp”)>=0,则为else{
add(“/nm/metadata/bin/win/libcurld.dll”);
添加(“/nm/metadata/bin/win/libfftw3f-3.dll”);
add(“/nm/metadata/bin/win/libmad.dll”);
add(“/nm/metadata/bin/win/libsamplerate.dll”);
添加(“/nm/metadata/bin/win/xp/mylib.dll”);
}如果(os.indexOf(“mac”)>=0,则为else{
返回false;
}
文件f=null;
用于(字符串存储箱:存储箱){
InputStream in=FileManager.class.getResourceAsStream(bin);
字节[]缓冲区=新字节[1024];
int read=-1;
试一试{
字符串[]temp=bin.split(“/”);
f=新文件(LIB_文件夹+“/”+temp[temp.length-1]);
File realF=新文件(f.getAbsolutePath());
如果(!realF.exists()){
FileOutputStream fos=新的FileOutputStream(realF);
while((read=in.read(buffer))!=-1){
写入(缓冲区,0,读取);
}
fos.close();
in.close();
}
System.out.println(“你好加载”);
加载(f.getAbsolutePath());
System.out.println(“Bye Load”);
}catch(异常e){System.out.println(“Bye异常”);FileManager.log(e.getMessage(),true);librariesLoaded=false;返回false;}
}
System.out.println(“Bye方法”);
图书馆等级=真;
返回true;
}
运行此main时,我将获得下一个输出:

Start loading libraries
Hello Load
Bye Load
Hello Load
Bye Load
Hello Load
Bye Load
Hello Load
Bye Load
Hello Load
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\java\workspace\Lib\mylib.dll: The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log for more detail
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at nm.player.FileManager.loadBinaries(FileManager.java:264)
    at nm.player.Player.<init>(Player.java:88)
    at nm.player.Player.main(Player.java:523)
开始加载库
你好负载
副载
你好负载
副载
你好负载
副载
你好负载
副载
你好负载
线程“main”java.lang.UnsatisfiedLink中出现异常错误:C:\java\workspace\Lib\mylib.dll:由于并行配置不正确,应用程序无法启动。有关更多详细信息,请参阅应用程序事件日志
位于java.lang.ClassLoader$NativeLibrary.load(本机方法)
位于java.lang.ClassLoader.loadLibrary0(未知源)
位于java.lang.ClassLoader.loadLibrary(未知源)
位于java.lang.Runtime.load0(未知源)
位于java.lang.System.load(未知源)
在nm.player.FileManager.loadBinaries(FileManager.java:264)
在nm.player.player。(player.java:88)
位于nm.player.player.main(player.java:523)
这个错误是因为它缺少一些C++系统DLL。但我的问题不是这个。我很担心这个错误之后程序会去哪里!我看不到catch上的打印,方法中循环后的打印,也看不到loadbinaries执行后main上的打印


我怎样才能抓住这类错误并加以处理?示例:当出现错误时,我想打印“请输入所有C++库”并控制它之后的流。

< P>是一个错误。根据JavaPMD不捕获错误是一个很好的实践

您可以通过这些链接了解更多信息

尝试更换

catch (Exception e)
loadBinaries()方法的底部,使用

catch (UnsatisfiedLinkError e)
unsatifiedlinkerror
Error
的子类,它不是
Exception
的子类:
Error
Exception
都是
Throwable
的子类,Throwable是Java异常层次结构的根

通常,您不会捕捉到
错误
s。但是,在这里这样做似乎是合理的,因为您可以向用户显示一条消息,说“缺少库X,请安装它”。

您得到的不是的子类,因此您的
catch
子句不会捕获它。如果希望捕获,请将捕获更改为
catch(错误e)

你看,Java的异常层次结构有点不直观。您有两个类,和,每个类都扩展。因此,如果你想抓住所有你需要抓住的东西,你可以扔掉(不推荐)


顺便说一句,是的一个子类。

虽然不捕获
Error
或其子类是一个很好的一般规则,但这种情况似乎是一个例外。
catch (Exception e)
catch (UnsatisfiedLinkError e)