2010-03-17 5 views
4

Pourquoi ce code n'imprime pas une trace de pile d'exception?Aucune sortie de l'exception

public class Playground { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     startThread(); 
    } 

    private static void startThread() { 
     ScheduledExecutorService timer = Executors 
       .newSingleThreadScheduledExecutor(); 
     Runnable r = new Runnable() { 
      int dummyInt = 0; 
      boolean dummyBoolean = false; 

      @Override 
      public void run() { 
       dummyInt = Integer.parseInt("AAAA"); 

       if (dummyBoolean) { 
        dummyBoolean= false; 
       } else { 
        dummyBoolean= true; 
       } 

      } 

     }; 

     timer.scheduleAtFixedRate(r, 0, 100, TimeUnit.MILLISECONDS); 

    } 

} 

Comment puis-je l'obtenir?

j'attendre à voir ceci:

java.lang.NumberFormatException: For input string: "AAAA" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at Playground$1.run(Playground.java:25) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source) 
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(Unknown Source) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(Unknown Source) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Répondre

8

L'exécuteur testamentaire définit probablement son propre gestionnaire d'exception non détectée sur le fil, de sorte que la trace de la pile ne sera pas imprimé à la console. Si une exception est levée dans le Runnable vous pouvez l'obtenir à partir de l'objet ScheduledFuture retourné par la méthode scheduleAtFixedRate:

ScheduledFuture<?> future = timer.scheduleAtFixedRate(r, 0, 100, TimeUnit.MILLISECONDS); 
try { 
    future.get(); 
} catch (ExecutionException e) { 
    Throwable cause = e.getCause(); 
    cause.printStackTrace(); 
} 
+0

Il n'est pas nécessaire de définir un gestionnaire d'exception non intercepté sur le thread. Il doit de toute façon attraper l'exception pour la signaler à l'avenir, et ne peut pas renvoyer l'exception car elle a toujours besoin du thread. –

0

Il y a une question similaire qui fournit une réponse Unhandled exceptions with Java scheduled executors ici sur StackOverflow.

Fondamentalement, ce que vous pouvez lire dans le scheduleAtFixedRate() javadoc:

Si l'exécution de la tâche rencontre une exception, exécutions ultérieures sont supprimées

Alors, je généralise de là que vous ne pouvez jamais voir vos exceptions lorsque vous soumettez des tâches via ScheduledExecutorService.scheduleAtFixedRate().

1

Le service d'exécution a tendance à avaler des exceptions pour une raison quelconque. Cela peut rendre le débogage assez difficile. Il suffit d'ajouter une prise d'essai autour du contenu de votre méthode run comme ceci:

public void run() { 
    try 
    dummyInt = Integer.parseInt("AAAA"); 

    if (dummyBoolean) { 
     dummyBoolean= false; 
    } else { 
     dummyBoolean= true; 
    } 
    } catch (Exception e){ 
    e.printStackTrace(); 
    } 

} 

Here's une question connexe.

Questions connexes