【问题标题】:Java: NoClassDefFoundError in overridden methodJava:重写方法中的 NoClassDefFoundError
【发布时间】:2011-12-14 09:36:58
【问题描述】:

我对覆盖有疑问。我需要覆盖 Cling UPnP 库中的一种方法。于是我扩展了一个服务类,写了如下代码:

public class UpnpBrowseService extends AndroidUpnpServiceImpl
{   
    @Override
    protected AndroidUpnpServiceConfiguration createConfiguration(WifiManager wifiManager)
    {
        return new AndroidUpnpServiceConfiguration(wifiManager)
        {
            @Override
            public StreamClient createStreamClient()
            {
                return new StreamClientImpl(new StreamClientConfigurationImpl() {
                    public int getConnectionTimeoutSeconds() {
                        return 2;
                    }
                    public int getDataReadTimeoutSeconds() {
                        return 3;
                    }
                    public boolean getStaleCheckingEnabled() {
                        // comment from AndroidHttpClient.java:
                        //
                        // Turn off stale checking.  Our connections break all the time anyway,
                        // and it's not worth it to pay the penalty of checking every time.
                        return false;
                    }
                    public int getRequestRetryCount() {
                        // since "connections break all the time anyway", limit number of retries to
                        // minimize time spent in HttpClient.execute()
                        return 1;
                    }
                });

            }
        };
    }
}

出于测试目的,'createStreamClient()' 方法现在与父类中的方法相同。 Source code of parent class is here.

如果我评论此方法,它可以正常工作。但是如果我使用我的重写方法,我会得到 NoClassDefFoundError:

12-14 09:52:12.110: E/AndroidRuntime(20784): FATAL EXCEPTION: Thread 18 (Active: 6)
12-14 09:52:12.110: E/AndroidRuntime(20784): java.lang.NoClassDefFoundError: org.teleal.cling.transport.impl.StreamClientImpl$1$1
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.transport.impl.StreamClientImpl$1.createURLStreamHandler(StreamClientImpl.java:77)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at java.net.URL.setupStreamHandler(URL.java:551)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at java.net.URL.<init>(URL.java:286)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at java.net.URL.<init>(URL.java:157)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.model.message.header.LocationHeader.setString(LocationHeader.java:45)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.model.message.header.UpnpHeader.newInstance(UpnpHeader.java:171)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.model.message.UpnpHeaders.parseHeaders(UpnpHeaders.java:68)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.model.message.UpnpHeaders.getAsArray(UpnpHeaders.java:136)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.model.message.UpnpHeaders.getFirstHeader(UpnpHeaders.java:143)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.model.message.discovery.IncomingSearchResponse.isSearchResponseMessage(IncomingSearchResponse.java:46)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.protocol.async.ReceivingSearchResponse.execute(ReceivingSearchResponse.java:54)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at org.teleal.cling.protocol.ReceivingAsync.run(ReceivingAsync.java:64)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-14 09:52:12.110: E/AndroidRuntime(20784):    at java.lang.Thread.run(Thread.java:1019)

我在解决这种 NoClassDefFoundError 方面有点新手,我不知道如何处理它。我想知道您是否可以帮我解决这个问题,或者至少指导我找到一些方法来确定这个问题的原因。

我发现这个异常是在静态元素有一些失败的时候发生的,但是这个类没有。

非常感谢!

【问题讨论】:

  • 如果我是 Java 运行时环境,我也会抱怨 :D。运行时说它找不到内部内部类。您是否尝试过将最内部的班级上移一级?或者可以测试当您在自己的 .java-File 中将两个内部类实现为自己的类时会发生什么。
  • 它们不仅仅是内部类,它们是匿名的内部类(它们都是)引导。

标签: java android overriding noclassdeffounderror


【解决方案1】:

JVM 抱怨它找不到org.teleal.cling.transport.impl.StreamClientImpl$1$1 类——它是import sun.net.www.protocol.http.Handler 的匿名实例——参见第77 行的here

所以很可能你的机器上没有安装这个 sun 包。但是为什么你以前不需要它。

但是,我认为这可能是与包装相关的问题。 stacktrace 指向 org.teleal.cling.transport.impl 包中的 StreamClientImpl 类,而您链接到的源代码是从 不同的包 导入其 StreamClientImpl 类 -- org.teleal.cling.transport.impl.apache (注意额外的 apache最后打包)。

你需要找出你真正想要的StreamClientImpl(可能是apache包中的那个)。

【讨论】:

    【解决方案2】:

    我认为问题在于找不到类StreamClientImpl,记住类的名称是它所在的目录和子目录,所以你找不到的类的名称是org .teleal.cling.transport.impl.StreamClientImpl,我不知道这个类,我想它是一个库。

    请记住,如果您导出项目并拥有 .class 或 .jar,则您的 clases 目录必须与类的名称相同,因此您必须拥有 StreamClientImplorg/teleal/cling/transport/impl/StreamClientImpl 之类的文件夹中。

    我希望这可能对你有所帮助......

    【讨论】:

      【解决方案3】:

      使用这些类来导入:

      org.fourthline.cling.transport.impl.apache.StreamClientConfigurationImpl
      org.fourthline.cling.transport.impl.apache.StreamClientImpl
      org.fourthline.cling.transport.spi.StreamClient
      

      我觉得会有帮助

      【讨论】:

        【解决方案4】:

        我和你有同样的问题,我已经解决了它导入库“teleal-common-1.0.13.jar”,问题得到了解决。

        我正在使用旧库 cling-core-1.0.5.jar。如果您使用的是新版本的库,也许您还需要导入一个新的 teleal-common 库。

        顺便说一句,我在 Android 应用中使用这个库。

        即,希望对你有所帮助。

        【讨论】:

          猜你喜欢
          • 2023-02-05
          • 2011-05-17
          • 1970-01-01
          • 2019-03-04
          • 1970-01-01
          • 2013-09-30
          • 2023-02-22
          • 1970-01-01
          • 2018-08-23
          相关资源
          最近更新 更多