Java newInstance вызов для сбоя JavaHelp с ошибкой createUI при втором и последующих вызовах
В моем приложении я динамически загружаю файл jhall для JavaHelp, поэтому мой код использует отражение. Странно то, что он отлично работает для первого вызова, и мои экраны JavaHelp отображаются нормально, со всей навигацией. Если я закрою свой экран JavaHelp и открою его снова, я получу сообщение:
Сбой UIDefaults.getUI(): сбой createUI() для javax.help.JHelpContentViewer[,0,0,0x0, недопустимый,alignmentX=0.0,alignmentY=0.0,border=,flags=0, MaximumSize=, минимум Size =, предпочитаемый Size=] java.lang.reflect.InvocationTargetException java.lang.Error
Это происходит со всеми запросами JavaHelp, кроме первого. Однако исключений не было, и я попытался отловить ошибку 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;
1 ответ
Оказывается, я могу решить эту проблему, повесив на переменную с именем "hv" (экземпляр JHelp), и не перерасчитывая ее каждый раз - очевидно, вся эта перезагрузка как-то повредила классы в хранилище...? Не знаю, имеет ли это смысл, но мое приложение сейчас работает. Мне было бы интересно узнать больше о том, что на самом деле вызвало это, и если есть методы для устранения неполадок в будущем, но ясно, что решение больше не является срочным! Спасибо всем, кто потратил на это время.