| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  22-05-2008, 15:49 | #1 | 
| Member Iscritto dal: Jun 2007 
					Messaggi: 38
				 | 
				
				[JAVA] Dubbio eccezioni
			 
		Salve ragazzi, non mi è chiara una cosa nel seguente programma, spero che qualcuno possa essermi di aiuto: Codice: public class Rethrowing {
  public static void f() throws Exception {
    System.out.println("originating the exception in f()");
    throw new Exception("thrown from f()");
  }
  public static void g() throws Throwable {
    try {
      f();
    } catch(Exception e) {
      System.err.println("Inside g(),e.printStackTrace()");
      e.printStackTrace();
    
     throw e.fillInStackTrace();
    }
  }
 
 public static void  main(String[] args) throws Throwable {
    try {
      g();
    } catch(Exception e) {
      System.err.println(
        "Caught in main, e.printStackTrace()");
      e.printStackTrace();
    }
  }
}originating the exception in f() Inside g(),e.printStackTrace() java.lang.Exception: thrown from f() at Rethrowing.f(Rethrowing.java:10) at Rethrowing.g(Rethrowing.java:14) at Rethrowing.main(Rethrowing.java:25) Caught in main, e.printStackTrace() java.lang.Exception: thrown from f() at Rethrowing.g(Rethrowing.java:19) at Rethrowing.main(Rethrowing.java:25) Da esso si evince che nel main viene intercettata una eccezione di tipo Exception, mi domando come questo sia possibile, in quanto all'interno di g(), tramite la chiamata e.fillInStackTrace(), viene generato e lanciato un oggetto eccezione di tipo "Throwable" e non Exception. Inoltre non mettendo un catch di Throwable all'interno del main siamo costretti a inserire la specifica dell'eccezione throws Throwable accanto alla dichiarazione del main e questo dimostra il fatto che g() in effetti lancia un Throwable. Mi chiedo dunque come sia possibile che all'interno del main venga intercettato un oggetto eccezione di tipo Exception? Spero di aver esposto il mio problema in maniera chiara Vi ringrazio in anticipo   Ultima modifica di spidey : 22-05-2008 alle 15:59. | 
|   |   | 
|  22-05-2008, 15:53 | #2 | 
| Senior Member Iscritto dal: Nov 2005 
					Messaggi: 2777
				 | 
		Per favore metti il codice tra i tag CODE e cambia il titolo del thread mettendo [JAVA] all'inizio
		 | 
|   |   | 
|  22-05-2008, 16:20 | #3 | 
| Senior Member Iscritto dal: Dec 2005 
					Messaggi: 7258
				 | 
		il fatto è che Exception implementa Throwable (che è solo un'interfaccia), quindi nella fattispecie l'oggetto che viene lanciato in realtà è di tipo Exception (nel metodo f).
		 | 
|   |   | 
|  22-05-2008, 16:39 | #4 | 
| Member Iscritto dal: Jun 2007 
					Messaggi: 38
				 | |
|   |   | 
|  22-05-2008, 16:43 | #5 | 
| Senior Member Iscritto dal: Dec 2005 
					Messaggi: 7258
				 | 
		ops è vero! ma il concetto non cambia.. Exception estende Throwable e l'oggetto che viene lanciato in f è di tipo Exception
		 | 
|   |   | 
|  22-05-2008, 16:43 | #6 | 
| Senior Member Iscritto dal: Oct 2007 Città: Padova 
					Messaggi: 4131
				 | 
		Sì, konte sarà stato tratto in inganno dal nome che finisce in -able (Throwable), tipico delle interfacce. Throwable è effettivamente una classe concreta, ma Exception è una subclass di Throwable e l'oggetto effettivamente istanziato in memoria è di tipo Exception. | 
|   |   | 
|  22-05-2008, 16:44 | #7 | |
| Senior Member Iscritto dal: Dec 2005 
					Messaggi: 7258
				 | Quote: 
   | |
|   |   | 
|  22-05-2008, 16:45 | #8 | 
| Senior Member Iscritto dal: Oct 2007 Città: Padova 
					Messaggi: 4131
				 | |
|   |   | 
|  22-05-2008, 16:51 | #9 | 
| Member Iscritto dal: Jun 2007 
					Messaggi: 38
				 | 
		Si, ma comunque resta inspiegato il fatto che devo specificare che il main lancia un Throwable.. Se l'eccezione è gestita dal catch di Exception perchè il compilatore mi costringe a specificare che main lancia un Throwable come se essa non fosse gestita?    | 
|   |   | 
|  22-05-2008, 17:30 | #10 | |
| Senior Member Iscritto dal: Dec 2005 
					Messaggi: 7258
				 | Quote: 
  ps. pensa se g lanciasse un oggetto Throwable ma non Exception.. che succederebbe? noi in realtà sappiamo che g lancia una Exception, ma il compilatore non può saperlo visto che g dichiara Throwable Ultima modifica di k0nt3 : 22-05-2008 alle 17:38. | |
|   |   | 
|  22-05-2008, 19:55 | #11 | 
| Member Iscritto dal: Jun 2007 
					Messaggi: 38
				 |  mmh.. Quindi k0nt3 mi stai dicendo che in realtà g() lancia una Exception mascherata da Throwable? Se si sapresti spiegarmi il meccanismo che c'è alla base? | 
|   |   | 
|  22-05-2008, 20:03 | #12 | 
| Senior Member Iscritto dal: Nov 2005 
					Messaggi: 2777
				 | 
		Secondo me la catch fa implicitamente un instanceOf e capisce che l'oggetto lanciato è un Exception e lo catcha.
		 | 
|   |   | 
|  22-05-2008, 22:44 | #13 | |
| Senior Member Iscritto dal: Dec 2005 
					Messaggi: 7258
				 | Quote: 
 il metodo fillInStackTrace() restituisce un Throwable, ma nella fattispecie contiene un Exception perchè nel metodo g viene catturata una Exception e rilanciata una e.fillInStackTrace() ora il compilatore sa solo che lanci una Throwable.. non sa che contiene un Exception (questo lo saprà solo la virtual machine a runtime) | |
|   |   | 
|  22-05-2008, 22:57 | #14 | 
| Member Iscritto dal: Jun 2007 
					Messaggi: 38
				 | 
		Adesso è tutto chiaro!   Grazie mille a tutti   | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 14:49.









 
		 
		 
		 
		 
   

 
		





 
  
 



 
                        
                        










