gpt4 book ai didi

JavaHelp 的 Java newInstance 调用在第二次及后续调用时崩溃并出现 createUI 错误

转载 作者:行者123 更新时间:2023-12-01 04:50:15 26 4
gpt4 key购买 nike

在我的应用程序中,我动态加载 JavaHelp 的 jhall 文件,因此我的代码使用反射。奇怪的是,它在第​​一次调用时工作正常,并且我的 JavaHelp 屏幕显示良好,包含所有导航。如果我关闭 JavaHelp 屏幕,然后再次打开它,我会收到消息:

UIDefaults.getUI() failed: createUI() failed for javax.help.JHelpContentViewer[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=] java.lang.reflect.InvocationTargetException java.lang.Error

除了第一个请求之外,所有 JavaHelp 请求都会发生这种情况。但是,没有捕获任何异常,并且我 try catch createUI 错误,但也没有捕获任何内容(显然这并不奇怪)。这可能是一个类加载器问题 - 我对类加载器有点不稳定 - 但没有捕获任何异常......我真的需要一些帮助来解决这个错误。短暂性脑缺血发作

FWIW,(大部分)代码如下 - jHelpClass 和 helpSetClass 在其他地方声明...

jHelpClass = null;
helpSetClass = null;
URLClassLoader cl = null;

File jFile = new File(jhallJarFile);
if (!(jFile.exists())) {
JOptionPane.showMessageDialog(frame,"JavaHelp jar file shown in properties does not exist");
return;
}
try {
URI uri = jFile.toURI();
URL url = uri.toURL();
URL[] urls = new URL[]{url};

// Create a new class loader with the directory
cl = new URLClassLoader(urls, this.getClass().getClassLoader());

jHelpClass = cl.loadClass("javax.help.JHelp");

// Find the HelpSet file and create the HelpSet object
helpSetClass = cl.loadClass("javax.help.HelpSet");
} catch (MalformedURLException e2) {
} catch (ClassNotFoundException e2) {
} catch (NoClassDefFoundError e2) {
}

if (jHelpClass == null || helpSetClass == null) {
JOptionPane.showMessageDialog(frame,
"JHelp class or HelpSet class not found in jar file");
return;
}

// HelpSet hs = null;

URL url = null;
//Object hv = null;
JComponent hv = null;
try {
url = this.getClass().getClassLoader()
.getResource("helpSet.hs");
if (url == null) {
JOptionPane.showMessageDialog(frame, "HelpSet not found");
return;
}


Constructor conhs = helpSetClass.getConstructor(
ClassLoader.class, URL.class);
//Object hs = conhs.newInstance(null, url);
Object hs = conhs.newInstance(cl, url);
Constructor conjh = jHelpClass.getConstructor(helpSetClass);
hv = (JComponent) conjh.newInstance(hs);

} catch (Exception e2) {
JOptionPane.showMessageDialog(frame,
"HelpSet could not be processed: " + e2);
return;
}

// Create a new frame.
final JFrame frame2 = new JFrame();
frame2.setTitle("Help DrawFBP");
frame2.setIconImage(favicon.getImage());
//frame2.setRequestFocusEnabled(true);
frame2.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent ev) {
if (ev.getKeyCode() == KeyEvent.VK_ESCAPE) {
//frame2.setVisible(false);
frame2.dispose();
}
}
});
// Set its size.
frame2.setPreferredSize(frame.getPreferredSize());
// Add the created helpViewer to it.
frame2.getContentPane().add(hv);code
// Set a default close operation.
frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// Make the frame visible.
frame2.setVisible(true);
frame2.pack();
return;

最佳答案

事实证明,我可以通过卡在名为“hv”的变量(JHelp 实例)上来解决这个问题,而不是每次都重新计算它 - 显然所有重新加载都以某种方式损坏了存储中的类......?不知道这是否有意义,但我的应用程序目前正在运行。我有兴趣更多地了解导致此问题的真正原因,以及将来是否有解决问题的技术,但显然解决方案不再紧迫!感谢所有为此花费时间的人。

关于JavaHelp 的 Java newInstance 调用在第二次及后续调用时崩溃并出现 createUI 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15116872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com