PDA

View Full Version : [JAVA] Dubbio eccezioni


spidey
22-05-2008, 14:49
Salve ragazzi, non mi è chiara una cosa nel seguente programma, spero che qualcuno possa essermi di aiuto:


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();
}

}
}


L'output è il seguente:

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 ;)

wingman87
22-05-2008, 14:53
Per favore metti il codice tra i tag CODE e cambia il titolo del thread mettendo [JAVA] all'inizio

k0nt3
22-05-2008, 15:20
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).

spidey
22-05-2008, 15:39
A me risulta che Throwable è una classe :what:

:read: http://java.sun.com/j2se/1.5.0/docs/api/ :read:

k0nt3
22-05-2008, 15:43
ops è vero! ma il concetto non cambia.. Exception estende Throwable e l'oggetto che viene lanciato in f è di tipo Exception

banryu79
22-05-2008, 15:43
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.

k0nt3
22-05-2008, 15:44
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.

esatto :p

banryu79
22-05-2008, 15:45
esatto :p
Cazz, postato in contemporanea :Prrr:

spidey
22-05-2008, 15:51
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? :muro:

k0nt3
22-05-2008, 16:30
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? :muro:

perchè g lancia Throwable :fagiano:

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

spidey
22-05-2008, 18:55
:what: 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?

wingman87
22-05-2008, 19:03
Secondo me la catch fa implicitamente un instanceOf e capisce che l'oggetto lanciato è un Exception e lo catcha.

k0nt3
22-05-2008, 21:44
:what: 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?
l'unico meccanismo alla base si tutto ciò è il polimorfismo:
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)

spidey
22-05-2008, 21:57
Adesso è tutto chiaro! :asd: Grazie mille a tutti ;)