• Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong na me: com/ray/net/UDP_Receive)


    一.事件经过

        今晚学习java网络编程,在eclipse中写了两个个java文件,一个发送端UDP_Send2.java,一个接收端UDP_Receive.java。实现发送端键盘录入信息,通过UDP传输方式将数据发送出去,接接收端再接受数据的功能。

        源码如下:

       1.UDP_Send2.java

    package com.ray.net;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    
    /*
     * 键盘录入
     * 
     * 需求:通过UDP传输方式,将一段文字数据发送出去。
     * 定义一个udp发送端。
     * 思路:
     *      1.建立udpsocket服务。
     *      2.提供数据,并将数据封装到数据包中。
     *      3.通过socket服务的发送功能,将数据包发送出去。
     *      4.关闭资源。
     */
    public class UDP_Send2 {
    
        public static void main(String[] args) throws Exception{
            // TODO Auto-generated method stub
            
            DatagramSocket ds=new DatagramSocket();
            
            //键盘录入
            BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
            
            String line=null;
            
            while((line=bufr.readLine())!=null){
                if("886".equals(line))  break;
                
                byte[] buf=line.getBytes();
                DatagramPacket dp=
                    new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.31.190"), 10001); 
    
                ds.send(dp);
            }
     
            ds.close();
        }
    
    }

    2.UDP_Receive.java

    package com.ray.net;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    /*
     * 需求: 定义一个应用程序,用于接收udp协议传输的数据并处理的。
     * 
     * 思路: 
     *       1.定义udpSocket服务。通常会监听一个端口。其实就是给这个就收网络应用程序定义数字标识。
     *       2.定义数据包,用于存储接收的数据。
     *       3.通过socket服务的receive方法,将接收到的数据存入数据包中。
     *       4.通过数据包的方法获取其中的数据。
     *       5.关闭资源
     * 
     */
    public class UDP_Receive {
    
        public static void main(String[] args) throws Exception{
            
            //1.创建udp socket, 建立端点,设置监听端口。
            DatagramSocket ds=new DatagramSocket(10001);
            
            while(true){   //由于ds.receive(dp)方法是阻塞式。
            //2.定义数据包,用于存储数据。
            byte[] buf=new byte[1024];
            DatagramPacket dp=new DatagramPacket(buf,buf.length);
            
            //3.通过服务的receive方法,将接收到的数据存入数据包中。
            //ds.receive(dp)方法是阻塞式方法,线程运行到此处,便停止。没数据就等,有数据接收数据。
            ds.receive(dp);                                   
            
            //4.通过数据包的方法获取其中的数据。
            String ip=dp.getAddress().getHostAddress();
            String data=new String(dp.getData(),0,dp.getLength());
            int port=dp.getPort();
            System.out.println(ip+"::"+data+"::"+port);
            }
            //5.关闭资源
            //ds.close();
            
            
            
            
            
            
        }
    }
            
            

         由于UDP_Send2.java实现了键盘录入功能,而在elclipse中运行之后不能调出给你输入的地方。因此我拷贝了这两个文件到了 E:Maijor_win7JAVAexampleNET 目录下。

    调用cmd,编译成功,然后执行命令:java  UDP_Receive。却报出了

    Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong na me: com/ray/net/UDP_Receive)

    二.异常信息

    Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong na
    me: com/ray/net/UDP_Receive)
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
            at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
    2)
            at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
            at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
            at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
            at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

    三.解决方案

    1.异常发生的原因:

        NoClassDefFoundError异常是 java虚拟机在编译时能找到合适的类,但是运行时在Java的classpath路径中却不能找到合适的类 导致的。

        而 Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong name: com/ray/net/UDP_Receive),这句话的意思是  main线程出了异常,找不到这个类:UDP_Receive(错误的名字:com/ray/net/UDP_Receive)。

        这两个java文件所在目录为:E:Maijor_win7JAVAexampleNET,看到这里,立马就知道是包名冲突了。

    2.解决异常

         删掉这两个java文件中的 package com.ray.net; 后,就都正常了。

  • 相关阅读:
    Apache的443端口被占用解决方法
    关于变量初始化问题
    浏览无法加载控件
    关于网络数据传输
    java 对象是在什么时候创建的?
    HTML HTTP
    2020 年计划
    Docker 学习
    [腾讯 TMQ] 接口测试用例设计
    pytest + request
  • 原文地址:https://www.cnblogs.com/shirui/p/5223734.html
Copyright © 2020-2023  润新知