|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#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. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Per favore metti il codice tra i tag CODE e cambia il titolo del thread mettendo [JAVA] all'inizio
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
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).
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jun 2007
Messaggi: 38
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
ops è vero! ma il concetto non cambia.. Exception estende Throwable e l'oggetto che viene lanciato in f è di tipo Exception
|
|
|
|
|
|
#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. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
|
|
|
|
|
|
#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?
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
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. |
|
|
|
|
|
|
#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? |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Secondo me la catch fa implicitamente un instanceOf e capisce che l'oggetto lanciato è un Exception e lo catcha.
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7262
|
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) |
|
|
|
|
|
|
#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: 13:54.













Grazie mille a tutti








