当前位置: 首页 > 面试题库 >

对Java中的NoClassDefFoundError进行故障排除

寇照
2023-03-14
问题内容

我有一个名为Main.java的Java程序,它位于以下目录中:

/home/user/program/Main.java

当我尝试从“程序”目录运行Main.java时,一切正常,我使用了以下行:

/home/user/program$ java Main

但是当我尝试从主目录运行Main.java时:

/home$ java /home/user/program/Main

我得到:

Exception in thread "main" java.lang.NoClassDefFoundError: /home/user/program/Main
Caused by: java.lang.ClassNotFoundException: .home.user.program.Main

此错误的原因是什么?


问题答案:

这是由于您的类路径所致,该类路径将默认为当前目录。java Main从中运行时,/home/user/program在当前目录中找到该类(因为该软件包似乎未设置,这意味着它是默认值)。因此,它在中找到类/home/user/program/Main.class

java /home/user/program/Main从开始运行,将/home尝试在类路径(当前目录)中查找该类,/home/home/user/program以期找到Main.class包含Mainpackage
的类定义的文件.home.user.program

额外的细节 :我认为Java启动器通过将类名的/-表示法转换为.-notation来尝试变得更好。当您运行java /home/user/program/Main它时, 它实际上正在java .home.user.program.Main为您运行。这是因为您不应该指定文件,而应该指定一个完全指定的类名(即,包括包说明符)。而且,当一个类具有包时,java希望在与包名匹配的目录结构中的类路径的目录(或jar)中找到该类;因此,它将尝试查找
/home/home/user/program类文件

您可以通过指定你的classpath修复-cp-classpath

java -cp /home/user/program Main


 类似资料:
  • 问题内容: 如何检查服务器上发送的邮件有问题?我运行一个简单的测试: 测试输出哪个文本;但是,没有邮件到达。 我该如何追踪问题? 问题答案: 这是一个很长的故事。一些要点(假设mail()返回true,并且错误日志中没有错误): 发件人地址(“发件人”)是否属于您服务器上的域?如果不是,请这样做。 您的服务器是否列入黑名单(例如,在spamhaus.org上检查IP)?共享托管的可能性很小。 邮件

  • 问题内容: 我已经按照本教程http://www.dsl.uow.edu.au/~sk33/php5java.htm进行了操作,但最后还是尝试了 我有这个例外 PHP致命错误:未捕获[o(Exception):“ java.lang.Exception:CreateInstance失败:new HelloWorld。原因:java.lang.ClassNotFoundException:在java

  • 问题内容: 对Windows上的锁定文件进行故障排除 问题答案: Jetty会为Web应用程序缓冲静态内容,例如HTML文件,CSS文件,图像等。如果你使用的是NIO连接器,Jetty将使用内存映射文件来执行此操作。问题是在Windows上,内存映射文件会导致文件锁定,因此你无法更新或替换文件。实际上,这意味着你必须停止Jetty才能更新文件。 Remedy Jetty提供了一个配置开关,用于De

  • 初始设置 在创建并启动新的 Serene 应用程序之后,不能显示登录页,而当你打开浏览器控制台,却得到一条错误消息:找不到 Template.LoginPanel: 你可能使用了无效的解决方案名称,如 MyProject.Something (包含点’.’)。 当项目以这种方式命名时,模板系统将不能定位模板。 请不要在解决方案名称中使用点符号(’.’),如果必须使用点符号,可在创建解决方案之后再重

  • 当使用 Gradle 时, 你肯定会碰到许多问题. 解决遇到的问题 如果你碰到了问题, 首先要确定你使用的是最新版本的 Gradle. 我们会经常发布新版本, 解决一些 bug 并加入新的功能. 所以你遇到的问题可能就在新版本里解决了. 如果你正在使用 Gradle Daemon, 先暂时关闭 daemon (你可以使用 switch —no-daemon 命令). 在第19章我们可以了解到更多关

  • 在Debian和Ubuntu上,当您安装标准的FreeRADIUS软件包时,FreeRADIUS服务器二进制文件称为freeradius而不是radiusd。 您可以创建将使用较慢服务器的ldap模块的命名实例。 然后,您可以使用冗余部分替换authorize部分中的ldap条目,该冗余部分首先使用快速LDAP服务器列出模块,然后使用较慢的部分使用ldap模块实例。 #ldap redundant