使用Java中的包启动线程时Eclipse中的ClassNotFound异常

时间:2010-12-14 20:55:33

标签: multithreading eclipse package classnotfoundexception

我刚刚在Eclipse中重构了一个项目,使用包而不是默认包来更好地组织我的代码。我有一个测试程序,它创建了许多Runnable对象,每个对象按顺序运行,但与主程序并行。

在重构这个工作正常之前,每个线程都尽职尽责地完成任务。但是,自从将事物移入包中后,只要其中一个Runnable类尝试使用另一个包中的类,我就会得到一个ClassNotFound异常。 Stacktrace如下:

java.lang.ClassNotFoundException: Tweet
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at indexing.TweetCleanup.run(TweetCleanup.java:84)
at java.lang.Thread.run(Unknown Source)

在此跟踪中,'TweetCleanup'是Runnable类,'Tweet'是未找到的类。我把它作为'common.Tweet'包含在TweetCleanup中(常见的是包)。我已经使用了一个单独的测试程序来查看它是否可以在主线程中看到该类,该类成功运行。

我能想到的是Thread需要提供一些类路径来“看”Tweet类,但在重构为包之前不是这种情况。我相信子Thread的默认行为是使用其父类的类路径,其中包括'common.Tweet'。

我正在使用Eclipse Helios作为我的IDE。

任何提示都将不胜感激!

干杯,

P

1 个答案:

答案 0 :(得分:3)

根本不是线程问题,但是你以某种方式使用Java序列化,并且尝试从存储有“旧”对象的流中读取对象。

我怀疑你正在使用Java Serialization的某种持久性,而你的TweetCleanup-Thread正在读取旧的“数据库”。删除此文件,您的程序将再次运行。

请注意,重命名包或移动类是二进制不兼容的更改 - 您不能再反序列化此类对象。