Java: NoClassDefFoundError в переопределенном методе - PullRequest
1 голос
/ 14 декабря 2011

хорошо, у меня есть вопрос о переопределении.Мне нужно переопределить один метод из библиотеки 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 () теперь такой же, как и в родительском классе. Исходный код родительского класса находится здесь.

Если я прокомментирую этот метод, он в порядке и работает.Но если я использую мой переопределенный метод, я получаю 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 ]

1 голос
/ 14 декабря 2011

JVM жалуется, что не может найти класс org.teleal.cling.transport.impl.StreamClientImpl$1$1 - это анонимный экземпляр import sun.net.www.protocol.http.Handler - см. здесь в строке 77.

Так что, вероятно,что на вашем компьютере не установлен этот пакет Sun.Но зачем вам это нужно, если раньше этого не было.

Однако я думаю, что это может быть связано с пакетом.Трассировка стека указывает на класс StreamClientImpl в пакете org.teleal.cling.transport.impl, тогда как исходный код, на который вы ссылаетесь, импортирует свой класс StreamClientImpl из другого пакета - org.teleal.cling.transport.impl.apache (обратите внимание на дополнительный пакет apacheв конце).

Вам нужно разобраться, какой StreamClientImpl вы действительно хотите (вероятно, тот, который находится в пакете apache).

1 голос
/ 14 декабря 2011

Я думаю, что проблема в том, что не удается найти класс StreamClientImpl, помните, что имя класса - это каталоги и подкаталоги, в которых он находится, поэтому имя вашего класса, которое вы не можете найти, равно org.teleal.cling.transport.impl.StreamClientImpl , я не знаю класс, я предполагаю, что он в библиотеку.

Помните, что если вы экспортируете проект и у вас есть .class или.jar, каталоги ваших предложений должны совпадать с именем класса, поэтому вы должны иметь StreamClientImpl в папке, такой как org / teleal /cling / transport / impl / StreamClientImpl .

Я надеюсь, что это может помочь вам ...

0 голосов
/ 11 августа 2015

У меня была та же проблема, что и у вас, и я решил ее, импортировав библиотеку "teleal-common-1.0.13.jar", и проблема была решена.

Я использую старую библиотеку cling-ядро-1.0.5.jar.Возможно, если вы используете новую версию библиотеки, возможно, вам также потребуется импортировать новую общую библиотеку teleal.

Кстати, я использую эту библиотеку в приложении для Android.

То есть, надеюсь быть полезным.

0 голосов
/ 14 июня 2013

Используйте эти классы для импорта:

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

думаю, это поможет

...