3

我遇到了一个Java应用程序不断抛出的问题:

java.lang.NoClassDefFoundError:无法初始化类 java.net.ProxySelector。

我正在运行 Suse Linux 10.3 并运行 java 1.6.0。我的 CLASSPATH 设置为

/usr/lib/jvm/jre-1.6.0-openjdk/lib.

似乎没有其他用户出现此错误,所以我假设它是我的设置。对于那些想知道应用程序是 yamj 的人(http://code.google.com/p/moviejukebox/

关于可能缺少什么或我可能做错了什么的任何想法?

编辑错误的完整痕迹如下:

java.lang.NoClassDefFoundError:无法在 java.security.AccessController.doPrivileged(Native Method) 的 sun.net.www.protocol.http.HttpURLConnection$5.run(HttpURLConnection.java:736) 处初始化类 java.net.ProxySelector sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:732) 在 sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:672) 在 sun.net.www.protocol。 http.HttpURLConnection.getInputStream(HttpURLConnection.java:997) 在 com.movi​​ejukebox.thetvdb.tools.XMLHelper.getEventReader(XMLHelper.java:19) 在 com.movi​​ejukebox.thetvdb.model.Mirrors.(Mirrors.java:30) 在com.movi​​ejukebox.thetvdb.TheTVDB.(TheTVDB.java:37) 在 com.movi​​ejukebox.plugin.TheTvDBPlugin.(TheTvDBPlugin.java:57) 在 sun.reflect.GeneratedConstructorAccessor2。新实例(未知来源)在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:532) 在 java.lang.Class.newInstance0(Class.java: 372) 在 java.lang.Class.newInstance(Class.java:325) 在 com.movi​​ejukebox.plugin.DatabasePluginController.getMovieDatabasePlugin(DatabasePluginController.java:96) 在 com.movi​​ejukebox.plugin.DatabasePluginController.access$000(DatabasePluginController.java: 30) 在 com.movi​​ejukebox.plugin.DatabasePluginController$1.initialValue(DatabasePluginController.java:44) 在 com.movi​​ejukebox.plugin.DatabasePluginController$1.initialValue(DatabasePluginController.java:39) 在 java.lang.ThreadLocal.setInitialValue(ThreadLocal.java :160) 在 java.lang.ThreadLocal。get(ThreadLocal.java:150) at com.movi​​ejukebox.plugin.DatabasePluginController.scan(DatabasePluginController.java:70) at com.movi​​ejukebox.MovieJukebox.updateMovieData(MovieJukebox.java:1051) at com.movi​​ejukebox.MovieJukebox.access$100( MovieJukebox.java:80) at com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox.java:613) at com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox.java:600) at java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:334) 在 java.util.concurrent.FutureTask.run(FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$ Worker.run(ThreadPoolExecutor.java:603) 在 java.lang.Thread.run(Thread.java在 com.movi​​ejukebox.MovieJukebox.updateMovieData(MovieJukebox.java:1051) 在 com.movi​​ejukebox.MovieJukebox.access$100(MovieJukebox.java:80) 在 com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox) 扫描(DatabasePluginController.java:70) .java:613) 在 com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox.java:600) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 在 java.util.concurrent.FutureTask.run (FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 在 java.lang.Thread。运行(线程.java在 com.movi​​ejukebox.MovieJukebox.updateMovieData(MovieJukebox.java:1051) 在 com.movi​​ejukebox.MovieJukebox.access$100(MovieJukebox.java:80) 在 com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox) 扫描(DatabasePluginController.java:70) .java:613) 在 com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox.java:600) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 在 java.util.concurrent.FutureTask.run (FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 在 java.lang.Thread。运行(线程.javajava:80) at com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox.java:613) at com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox.java:600) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask .java:334) 在 java.util.concurrent.FutureTask.run(FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker。在 java.lang.Thread.run(Thread.java 运行(ThreadPoolExecutor.java:603)java:80) at com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox.java:613) at com.movi​​ejukebox.MovieJukebox$4.call(MovieJukebox.java:600) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask .java:334) 在 java.util.concurrent.FutureTask.run(FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker。在 java.lang.Thread.run(Thread.java 运行(ThreadPoolExecutor.java:603)runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 在 java.lang.Thread.run(Thread.javarunWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 在 java.lang.Thread.run(Thread.java

4

4 回答 4

1

ProxySelector 是一个抽象类。您是否要直接实例化它?

于 2009-12-24T05:13:20.263 回答
0

我的 CLASSPATH 设置为 /usr/lib/jvm/jre-1.6.0-openjdk/lib。

不要认为那应该在你的 CLASSPATH 中

尝试清除 CLASSPATH 并运行它

于 2009-12-24T05:29:45.987 回答
0

首先,您不必将“/usr/lib/jvm/jre-1.6.0-openjdk/lib”放在类路径中。“java”命令应该将所有标准 J2SE 库放在 bootclasspath 上,而无需您做任何事情。

其次,如果您向我们提供完整的堆栈跟踪信息,而不仅仅是异常消息,将会有所帮助。我怀疑真正的问题是 java.net.ProxySelector (或它依赖的东西)在静态初始化期间失败了。但只有堆栈跟踪才能证实这一点。

于 2009-12-24T05:50:22.630 回答
0

由于这是谷歌搜索此错误的第二个结果,我想发布我在某个论坛上找到的这段代码,它帮助我解决了同样的异常。无法详细解释 - 这对我来说只是一个快速测试项目,所以我没有时间进行更深入的调查。

static { 
  try {
    Class c = Class.forName("sun.net.spi.DefaultProxySelector");
    if (c != null && ProxySelector.class.isAssignableFrom(c)) {
       theProxySelector = (ProxySelector) c.newInstance();
    }
  } catch (Exception e) {
    theProxySelector = null;
  }
}
于 2012-12-27T16:21:56.583 回答