线程“主”java.lang.NoClassDefFoundError 中的异常:错误名称

Posted

技术标签:

【中文标题】线程“主”java.lang.NoClassDefFoundError 中的异常:错误名称【英文标题】:Exception in thread "main" java.lang.NoClassDefFoundError: wrong name 【发布时间】:2013-01-09 08:34:12 【问题描述】:

我的文件目录:

project/src/m2mcom/entities/AutomatedTelnetClient.java
           /web/Simple.java           
           /org/apache/commons/net/telnet/TelnetClient.java 

Simple.java的源代码:

package m2mcom.web;
import m2mcom.entities.AutomatedTelnetClient;
import java.util.*;
import java.io.*;

public class Simple 
    public static void main(String [] args) 
        try 
            AutomatedTelnetClient telnet = new AutomatedTelnetClient();
            String answer = telnet.request();
            System.out.println(answer);
         catch (Exception e) 
            System.err.println("Error");
        
    

当我执行 Simple.class 时,没有任何编译错误,我收到以下错误消息:

C:\Users\Victor\Desktop\project2\src\m2mcom\web>java Simple
Exception in thread "main" java.lang.NoClassDefFoundError: Simple (wrong name: m
2mcom/web/Simple)

有谁知道如何解决这个问题?

【问题讨论】:

看看这个链接你就会明白为什么你会得到这个错误以及如何在未来避免它javarevisited.blogspot.co.uk/2011/06/… 【参考方案1】:

您在错误的文件夹中使用错误的类名执行命令。运行 Java 类时需要使用完全限定名称 (FQN)。当然,您必须位于正确的目录中。在您的示例中,您的班级的 FQN 是 m2mcom.web.Simple(package m2mcom.websimple 名称 Simple 的组合)。

就推导正确的目录而言,你的类是存储在一个分层的文件夹结构中,基本上是从C:\Users\Victor\Desktop\project2\src开始的。

所以要正确执行你的程序,从C:\Users\Victor\Desktop\project2\src,做;

java m2mcom.web.Simple

【讨论】:

在运行 Java 类时需要使用完全限定名,而且您也在错误的文件夹中运行程序。 非常感谢 Perception 的清晰回答!【参考方案2】:
package m2mcom.web;

删除上面的行并重新编译它。 当您在 netbeans 中运行代码时,它包括在 m2mcom.web 包中。这不在您的类文件中。

【讨论】:

【参考方案3】:

因此,当您执行 java 命令时,您必须位于包名正上方的目录中,该命令的格式应为 packagename.classname,不带 .class 后缀。

【讨论】:

以上是关于线程“主”java.lang.NoClassDefFoundError 中的异常:错误名称的主要内容,如果未能解决你的问题,请参考以下文章

主线程啥都没做,就会等待子线程结束。这是为啥?

Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

子线程怎么不阻塞主线程

QT中UI主窗口如何与子线程相互传递参数

java 子线程 回调 主线程

C++怎么在主线程中使用子线程的数据? 比如说主线程中有一个数组,如何在子线程中调用这个数组