Java:重写方法中的NoClassDefFoundError

时间:2011-12-14 09:36:58

标签: java android override noclassdeffounderror

我对覆盖有疑问。我需要从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.

如果我对此方法发表评论,那就可以了。但是如果我使用我的override方法,我会得到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方面有点新手,我不知道如何处理它。我想知道你是否可以帮助我,或者至少指导我如何确定这个问题的原因。

我只发现当静态元素出现故障时会发生这种异常,但是这个类没有它们。

非常感谢!

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

因此,您的计算机上可能没有安装此Sun软件包。但是,如果你以前没有,为什么还需要它。

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

你需要弄清楚你真正想要的org.teleal.cling.transport.impl.apache(可能是apache包中的那个)。

答案 2 :(得分:0)

使用这些类导入:

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

我认为这会有所帮助

答案 3 :(得分:0)

我遇到了与你相同的问题,我已经解决了它导入库&#34; teleal-common-1.0.13.jar&#34;问题得到了解决。

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

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

那就是希望有所帮助。