2010-10-31 5 views
0

J'essaie d'entourer mon code avec des exceptions partout, donc je n'ai pas de fuites de mémoire. J'ai essayé le code suivant, et pour une raison quelconque, l'exception n'est pas traitée et j'ai une erreur d'exécution.Exceptions avec des threads anonymes

du code:

try 
     { 
      methodA(); 
     } catch (Throwable th) 
     { 
      MsgProxyLogger.error(TAG, th.getMessage()); 
     } 
    } 


protected void methodA() 
{ 


      Thread disptacherThread = new Thread() 
      { 

       @Override 
       public void run() 
       { 
        dispatcher.dispatch(existingMessagesArr); 
       } 
      }; 
      disptacherThread.start(); 
    } 

Maintenant, si une exception d'exécution occurse à l'intérieur du fil, il ne sera pas pris dans les clauses throable?

pourquoi est-ce? le thread anonyme annule-t-il les clauses catch?

Merci,

ray.

Répondre

0

Maintenant, si une exception d'exécution se produit dans le thread, il ne sera pas pris dans les clauses throwable?

C'est correct. Un try/catch ne peut capturer que les exceptions lancées par le thread en cours. Le code de la méthode run de Runnable anonyme est exécuté sur un thread différent.

Il y a deux solutions à ce:

  • Mettre un try/catch dans la méthode run pour faire face à l'exception.
  • Enregistrez un UncaughtExceptionHandler avec le fil de l'enfant, ou son ThreadGroup.

Soit dit en passant, si vous êtes concernés par les exceptions des fuites de ressources, la meilleure solution est d'écrire votre code en utilisant ce modèle:

Resource r = // allocate resource 
    try { 
     // use resource r 
    } catch (...) { 
     ... 
    } finally { 
     // release resource r 
    } 

attraper simplement et les exceptions d'exploitation forestière (comme votre code exemple ne) sera ne guérit pas une fuite de ressources.

1

Malheureusement non.

Le bloc try-catch est capable d'intercepter uniquement la méthode Thread.Start() (c'est-à-dire mémoire insuffisante). Mais une fois que le thread est démarré, ou mieux, a été programmé pour démarrer, vous allez perdre le contrôle de celui-ci.

Si une exception unhandlex dépasse la portée du thread, votre machine virtuelle Java se bloquera. Vous devriez entourer votre méthode anonyme interne avec try-catch.

J'espère avoir été utile.

Questions connexes