2011-12-14 3 views
1

У меня есть вопрос об переопределении. Мне нужно переопределить один метод из библиотеки Cling UPnP. Таким образом, я расширил класс обслуживания и написал следующий код:Java: NoClassDefFoundError в переопределенном методе

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

Я только узнал, что это исключение возникает, когда есть некоторый сбой в статических элементах, но у этого класса их нет.

спасибо!

+1

Если бы я был средой выполнения Java, я бы тоже пожаловался: D. Время выполнения говорит, что он не может найти внутренний внутренний класс. Вы пробовали переместить внутренний класс на один уровень выше? Или, может быть, проверьте, что происходит, когда вы реализуете оба внутренних класса как свои собственные классы в собственном .java-файле. –

+0

Они не просто внутренние классы, они анонимные внутренние классы (оба) для загрузки. – Dunes

ответ

1

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

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

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

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

1

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

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

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

0

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

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

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

0

я имел тот же вопрос, чем вы, и я разрешил его импортировать библиотеку «teleal-синфазного 1.0.13 .jar ", и проблема была решена.

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

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

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

Смежные вопросы