我正在尝试用java反射加载一堆类。一切似乎工作正常(如果找不到类,我正在处理异常)。
但是有一个特定的类正在引发另一个异常,它不是通过调用Class.forname()而是通过内部方法抛出的,因此我甚至无法捕获它。
这是我的代码:
try {
URL url = Class.forName(qualifiednameOfTheClass);
} catch (ClassNotFoundException ex) {
// ok class not found can be handled
} catch (Exception e){
// catch every other exception just to try to get the strange exception
}
因此,使用此代码,一切正常,我在很多课程中使用它并且它正在工作(有时它发现它有时它不会)。
然而,有一个案例不能正常工作,我无法理解为什么。如果qualifiednameOfTheClass = sun.security.krb5.SCDynamicStoreConfig
我的代码引发异常:
线程中的异常" mythread-1" java.lang.UnsatisfiedLinkError:没有 osx在java.library.path中 java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)at java.lang.Runtime.loadLibrary0(Runtime.java:849)at java.lang.System.loadLibrary(System.java:1088)at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:67) 在 sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:47) 在java.security.AccessController.doPrivileged(Native Method)at sun.security.krb5.SCDynamicStoreConfig。(SCDynamicStoreConfig.java:39) at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:190)at com.myclass.getJARFromClassForName(JavaId.java:510) 在com.myclass.getJARUrl(Id.java:550)at com.myclass.collectInformation(Graph.java:366) 在 com.myclass.createNode(Graph.java:166) 在com.myclass.Graph。(Graph.java:143)at com.myclass2.run(myclass2.java:246) 在java.lang.Thread.run(Thread.java:745)
因此,您可以在错误中看到我们有这个奇怪的异常,即使使用像我的代码中的泛型捕获也无法捕获,我无法理解为什么它已被引发,实际上是什么是这个osx库(我在linux上)
编辑:我发现的唯一一件事就是这个链接http://www.straub.as/java/pocketapi/index7.html但是是德语,所以我用谷歌翻译阅读它,我不知道我是否做得对,但是说这些课程列出那里不能用Class.forname()本身复制。这是真的吗?有没有理由为什么这不能反映或我做错了什么?
答案 0 :(得分:3)
“无法抓住”因为它是Error
,而不是Exception
。我建议在JDK中查看Throwable
的对象层次结构。
尝试将其更改为Throwable
,您将获得更好的运气。我不知道为什么会发生错误。
这看起来像是使用本机代码的JNI类。我不知道你在做什么,但对我来说这看起来不错。
答案 1 :(得分:3)
这不是这个类期望加载的方式,直接加载这个内部类似乎不起作用。您需要使用标准加密API加载该类,以便可以按预期加载此类,或者可能根本不加载该类(它可能是仅适用于OSX的代码)
答案 2 :(得分:1)
正如您在所提供的链接中所看到的,有一些类会导致此方法失败。
在这些对象上调用此方法时,Java首先需要加载其他内容,因为这是特定于平台的内容,默认情况下不会发送。在您的情况下,它是 Kerberos ,一个安全API。 正如您在Documentation中看到的,它会搜索特定路径中的某些文件( java.library.path )。由于它无法在那里找到它,它会引发错误 请注意,错误 UnsatisfiedLinkError 并不是指查找 sun.security.krb5.SCDynamicStoreConfig 本身的类名。它指的是在 java.library.path 提供的路径中找不到本机库 此路径本身(例如在 Windows 上)指向 C:Windows / system32 / 。
但是,您可能会在catch(Error e)
中发现此错误,请注意错误不是异常(Throwable hierarchy)。
请注意,一般情况下捕获错误并不是一个好的理念,因为您无法确定JVM是否可以从中恢复。