2015-08-11 1 views
7
class TestExceptions { 

    public static void main(String[] args) throws Exception { 
     try { 
      System.out.println("try"); 
      throw new Exception(); 
     } catch(Exception e) { 
      System.out.println("catch"); 
      throw new RuntimeException(); 
     } finally { 
      System.out.println("finally"); 
     } 
    } 
} 

Di seguito sono riportate le uscite quando si tenta di eseguire il codice in eclissi più volte. Ho creduto finora che ogni volta che l'ultima riga del codice da entrambi i try/catch block sta per essere eseguita (che potrebbe essere restituita o lancia il nuovo tipo Exception() di stmt), infine verrà eseguito il blocco, ma qui l'output è diverso ogni volta? Qualcuno può chiarire se la mia ipotesi è giusta o sbagliata?Perché l'uscita è diversa ogni volta? try catch finally exception code

try 
catch 
Exception in thread "main" finally 
java.lang.RuntimeException 
    at TestExceptions.main(TestExceptions.java:9) 


Exception in thread "main" try 
catch 
java.lang.RuntimeException 
    at TestExceptions.main(TestExceptions.java:9) 
finally 
+1

correlati: http://stackoverflow.com/questions/23588123/why-does-the-execution-order-between-the-printstacktrace-and-the-other-methods – JonK

risposta

9

Questo è chiaramente perché eclissi sta stampando la error stream e output stream senza una corretta sincronizzazione in consolle. Molte persone hanno visto problemi a causa di questo.

Esegui il programma in un prompt dei comandi e vedrai output corretto ogni volta.

+0

Sì, ottenuto sotto l'output quando l'ho eseguito più volte dal prompt dei comandi. provare cattura finalmente Exception in thread "main" java.lang.RuntimeException a TestExceptions.main (TestExceptions.java:9) Eclipse, flusso di errore e flusso di uscita sono asincrone, che è qualcosa di nuovo che ho imparato oggi. Ma stanno ancora accedendo alla stessa console e anche il prompt dei comandi sta accedendo alla console di uscita singola ... perché una tale enorme differenza? – Dish

0

concordando con @Codebender, è possibile sostituire tutte le eccezioni di thows e sostituirle con printStackTrace(); quindi le eccezioni e le uscite verranno stampate in syn. EG:

public static void main(String[] args) throws Exception { 
     try { 
      System.out.println("try"); 
      throw new Exception(); 
     } catch(Exception e) { 
      System.out.println("catch"); 
      e.printStackTrace(); 
     } finally { 
      System.out.println("finally"); 
     } 
    } 
} 
+0

'printStackTrace' viene stampato anche nello stream degli errori. Quindi niente dovrebbe cambiare. Suggerisco di usare 'System.err' invece di' System.out' per ottenere un output coerente. – talex

+0

ma userà lo stesso battistrada in questo caso il battistrada "principale". Così le uscite saranno in ordine. – Kamidu