2011-12-14 4 views
1

Eh bien, j'ai une question sur le remplacement. Je dois remplacer une méthode de la bibliothèque Cling UPnP. Donc, je tendis une classe de service et écrit le code suivant:Java: NoClassDefFoundError dans la méthode surchargée

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; 
        } 
       }); 

      } 
     }; 
    } 
} 

Pour des fins d'essai la méthode « createStreamClient() » est maintenant même que dans la classe mère. Si je commente cette méthode, elle est OK et fonctionne. Si vous commentez cette méthode, c'est OK. Mais si j'utilise ma méthode surchargée, je reçois 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) 

Je suis un peu novice peu dans la résolution de ce genre NoClassDefFoundError et je ne sais pas quoi faire. Je me demande si vous pourriez m'aider avec cela ou au moins me diriger vers une méthode pour déterminer la cause de ce problème.

J'ai seulement découvert que cette exception se produit quand il y a une défaillance dans les éléments statiques, mais cette classe ne les possède pas.

Merci beaucoup!

+1

Si j'étais un environnement d'exécution Java, je me plaindrais aussi: D. L'exécution dit qu'il ne peut pas trouver la classe interne intérieure. Avez-vous essayé de déplacer le niveau le plus interne de la classe? Ou peut-être tester ce qui se passe lorsque vous implémentez les deux classes internes comme leurs propres classes dans un propre fichier .java. –

+0

Ce ne sont pas seulement des classes internes, ce sont des classes internes anonymes (les deux) pour démarrer. – Dunes

Répondre

1

La machine virtuelle Java se plaint qu'il ne peut pas trouver la classe org.teleal.cling.transport.impl.StreamClientImpl$1$1 - c'est une instance anonyme de import sun.net.www.protocol.http.Handler - voir here en ligne 77.

Il est donc probable que vous n'ayez pas installé ce paquet solaire sur votre machine. Mais pourquoi en aurais-tu besoin quand tu ne l'as pas fait auparavant?

Cependant, je pense que cela peut être un problème lié à l'emballage. La piletrace pointe vers une classe StreamClientImpl dans le package org.teleal.cling.transport.impl, tandis que le code source auquel vous liez importe sa classe StreamClientImpl de package différent - org.teleal.cling.transport.impl.apache (notez le package extra apache à la fin).

Vous avez besoin de trier quel StreamClientImpl vous voulez vraiment (probablement celui du paquet apache).

1

Je pense que le problème est que ne trouve pas la classe StreamClientImpl, rappelez-vous que le nom de la classe est les répertoires et sous-répertoires où il est, de sorte que le nom de votre classe, vous ne trouvez pas est org.teleal. cling.transport.impl.StreamClientImpl, je ne connais pas la classe, je suppose que c'est dans une bibliothèque.

Rappelez-vous que si vous exportez le proyect et votre .class ou .jar, les répertoires de votre clases doit être le même que le nom de la classe, vous devez donc avoir le StreamClientImpl dans un dossier comme org/teleal/cling/transport/impl/StreamClientImpl.

J'espère que cela pourrait peut-être vous aider ...

0

Utilisez ces classes pour importer:

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

je pense que ça va aider

0

J'ai eu le même problème que vous et je l'ai résolu importer la bibliothèque « teleal-common 1.0.13 .jar "et le problème a été résolu.J'utilise l'ancienne bibliothèque cling-core-1.0.5.jar. Peut-être que si vous utilisez la nouvelle version de la bibliothèque, vous devrez peut-être aussi importer une nouvelle bibliothèque teleal-common. En passant, j'utilise cette bibliothèque dans une application Android.

C'est, espérons être utile.

Questions connexes