【发布时间】:2019-12-19 23:25:08
【问题描述】:
我目前正在编写 Java Swing 应用程序。
这是我期望发生的过程:
- 用户单击按钮
- 多个任务在后台运行
- 任务完成后,将更新 JTextArea 并显示流程已完成的消息。
我遇到的问题发生在第 2 步。其中一个后台进程使用如下所示的枚举:
public enum FilePaths {
MAIN_AUTH,
MAIN_AUTH_CREDS,
MAIN_ACTIONS,
MAIN_FETCH,
MAIN_META,
MAIN_RESRS,
TEST_AUTH,
TEST_AUTH_CREDS,
TEST_ACTIONS,
TEST_FETCH,
TEST_META,
TEST_RESRS;
}
到达使用此枚举的第一个方法时执行失败,显示以下错误:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: .../gui/guicontroller/authentication/FilePaths
Caused by: java.lang.ClassNotFoundException: ...gui.guicontroller.authentication.FilePaths
下面是 Swing 中最初启动后台执行的方法:
private class createButtonClicked implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String message = guiController.rename();
console.append(message);
if (!guiController.getSessions()) {
String remove = guiController.remove();
console.append(removeSessions);
}
String addFields = guiController.writeData();
console.append(addFields);
}
}
概述:
- 控制台:JTextArea 添加消息
- guiController:视图和模型之间的控制器
- rename():使用 ProcessBuilder 运行 bash 脚本(在内部使用 waitFor())(不会导致错误!)
- remove():导致错误并且是第一个使用 Enum 的方法调用
到目前为止我已经尝试过什么:
- 在 JUnit 测试中运行相同的方法调用 -- 一切正常
- 在运行应用程序和单元测试时使用调试器和 ClassLoader,单元测试和应用程序加载的类数之间的差异是 ~300 和 ~50。
- 类加载器在运行应用程序时不显示枚举,但在运行单元测试时显示它。
编辑:所有代码都是我的,没有拼写错误。已经检查过了。
EDIT2:这里还有一些代码:
public class GuiController {
private AuthenticationParser authenticationParser;
...
public String remove() {
return authenticationParser.remove();
}
}
import static ...gui.guicontroller.authentication.FilePaths.*;
public class AuthenticationParser {
...
public String remove() {
String path = GuiUtils.generatePath(MAIN_AUTH_CREDS, name);
...
}
}
remove() 中显示的行是导致异常的原因。方法generatePath() 不会被调用。
GuiController 位于 ...gui.guicontroller 下。 AuthenticationParser 位于 ...gui.guicontroller.authentication 下,与 FilePaths 相同。
【问题讨论】:
-
表示你需要的类不在类路径中。如果这都是你自己的代码,可能你拼错了一个类名。
-
1.你能告诉我们
gui.guicontroller.authentication.FilePaths类的定义在哪里吗? 2. 你能显示同一个类包含在类路径中的什么位置吗? -
@markspace 老实说,package
authentication看起来很像它应该是“身份验证”。但很好的猜测。 -
@ElliottFrisch 我对代码错误有很好的猜测,因为我自己在某些时候犯了所有这些错误。 ;)
-
@markspace 我试图记录我的代码错误,但我想象中的计数器溢出了,它正慢慢地回到零!
标签: java swing classloader swingworker