【问题标题】:Java Swing app causes a ClassNotFoundExceptionJava Swing 应用程序导致 ClassNotFoundException
【发布时间】:2019-12-19 23:25:08
【问题描述】:

我目前正在编写 Java Swing 应用程序。

这是我期望发生的过程:

  1. 用户单击按钮
  2. 多个任务在后台运行
  3. 任务完成后,将更新 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 的方法调用

到目前为止我已经尝试过什么:

  1. 在 JUnit 测试中运行相同的方法调用 -- 一切正常
  2. 在运行应用程序和单元测试时使用调试器和 ClassLoader,单元测试和应用程序加载的类数之间的差异是 ~300 和 ~50。
  3. 类加载器在运行应用程序时不显示枚举,但在运行单元测试时显示它。

编辑:所有代码都是我的,没有拼写错误。已经检查过了。

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


【解决方案1】:

如果您说 JUnit 执行运行良好,而 swing 执行产生 ClassNotFound 异常,请检查有问题的类 (FilePaths) 是否位于主源目录中,而不是位于测试目录中。

【讨论】:

  • 感谢您的回答!但我已经检查过了。在我看来,Swing 只是出于某种原因不想加载某些类。如果我不使用 SwingWorker/SwingUtilities,您知道 Swing 是否会无法加载类吗?我有一个多窗口应用程序,所以我认为这可能是线程问题...
  • 嗯...据我所知不是。我是否可以建议您在项目中从头开始创建一个新的 Enum 类,使用新的不同名称,然后将 FilePaths 的每个引用替换为您的新类?
  • 也已经尝试过了。和以前一样的问题,我得到一个 ClassNotFound 异常。但它在单元测试中仍然有效......
  • 更多尝试:您是否已经尝试将整个应用程序部署到 JAR 中,然后执行它?我怀疑类文件或目录可能会在您的应用程序执行过程中被删除或移动...
  • 我还没有尝试过。谢谢你的主意!完成后会尝试更新。
猜你喜欢
  • 2014-04-10
  • 2021-11-15
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多