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传输方式将数据发送出去,接接收端再接受数据的功能。

一.事件经过

    今晚学习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_win7\JAVA\example\NET 目录下。

调用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_win7\JAVA\example\NET,看到这里,立马就知道是包名冲突了。

2.解决异常

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

 

目录
相关文章
|
1月前
|
Java 网络安全 Maven
Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
44 2
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
32 3
|
2月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
56 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
41 2
|
Java 程序员 C#
【.Net vs Java? 】 看一看二者的类有多像?(一)
【.Net vs Java? 】 看一看二者的类有多像?
423 0
【.Net vs Java? 】 看一看二者的类有多像?(一)
|
1天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
3天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
3天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
3天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
18 3
|
3天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
37 2