Enrico Denti, Franco Zambonelli - ECCEZIONI IN JAVA1
U n iv e rs it à d e g li S tud i d i M od e n a e R e gg io E m ili a
F ac o lt à d i I ng e gn e ri a
C O R S O D I
F O NDA M E N T I D I I N F O R M A T ICA II L ingu a gg io Java : E cce z ion i
Ing . F ra n c o Z a m bon e lli
Lu c id i rea li zz a ti i n c o ll a bo ra z ion e c on Ing . E n ri c o D e n ti - U n iv . B o logn a
A nno A cca d e m ic o 1999 /2000
Enrico Denti, Franco Zambonelli - ECCEZIONI IN JAVA2
E CC EZ IO N I
S p ess o i p rog ra mmi con te ngono is tr u zi on i “c riti ch e” , ch e po tr ebb er o po rta re a e rr o ri.
T ip ica m en te , in qu ei ca si si i n se ris cono con tr o lli ( if … then .. ) p er in te rce tt ar e le sit u az ion i cr iti ch e e ce rca re d i g es ti rle in m odo app rop ria to .
T u tt av ia , qu es to m odo d i p ro ce d er e è sp ess o in sodd is face n te : • non è fac il e p re v ed er e tu tt e le sit u az ion i ch e po tr ebb er o p rodu rr e l’ err o re • “g es ti re” l’ err o re sp ess o si gn if ica so lo st am p ar e a v id eo qu al ch e m ess agg io .
Java a d o tt a a n ch e in qu es to a m b it o un a pp ro cc io inn ova tivo , in tr o du ce nd o il co n ce tt o d i ecce zi o n e: • an zi ch é te n ta re d i p re v ed er e i ca si ch e po ss ono po rta re a e rr o re , si p ro va a es eg u ir e l’ op er a zi o n e in un b lo cc o “ co n tr o ll a to” • se si p rdu ce un err o re , l’ o p er a zi o n e so ll ev a un ’ecce zi o n e • l’ eccez io n e v ie n e ca tt u ra ta d a l b lo cc o en tr o cu i l ’o p er a zi o n e er a es eg u it a , e pu ò ess ere g es tit a n el m o d o p iù a pp ro p ri a to .
try {
// operazione critica che può sollevare eccez. }
catch (Exception e) {
// gestione dell’eccezione }
S e l’ op er az ion e può so ll ev ar e d iv er si ti p i d i eccez ion e (c o rr is pon - d en ti a d iv er si ti p i d i err o re ), po ss ono ess er e p re v is ti p iù b lo cc h i
catch d i se gu it o all o st ess o b lo cc o try .
Enrico Denti, Franco Zambonelli - ECCEZIONI IN JAVA3
E S E M P IO
U n a ti p ica op er az ion e “c riti ca” è la le tt u ra d a inpu t. In Ja v a, il d is po siti vo d i i npu t st and ar d è la v ar ia b il e ( static )
System.in , d i cl ass e InputStream ( un a c la ss e a st ra tt a, d i cu i
System.in è un a is ta n za “a no m al a” p re d ef in it a) .
P o ic h é InputStream f o rn is ce so lo un m et odo read() c h e le gg e si ngo li by te , si u sa in ca p su la re System.in in un ogg ett o do ta to d i m agg io ri fun zi o n alit à, co m e a d es em p io un Buffered Reader , ch e fo rn is ce a n ch e un m et odo readLine() :
import java.io.*;
class EsempioIn {
public static void main(String args[]){ int a = 0, b = 0;
BufferedReader in = new BufferedReader( new InputStreamReader( System.in )); try { System.out.print("Primo valore: "); a = Integer.parseInt(in.readLine()); System.out.print("Secondo valore:"); b = Integer.parseInt(in.readLine()); } catch (IOException e) { System.out.println("Errore in input"); } System.ou t.println("La somma vale " + (a+b)); } }
Q u i, readLine() s o ll ev a un a IOException in ca so d i err o re in fa se d i i npu t, m en tr e Integer.parseInt() so ll ev a un a Num-
berFormatException ( non ca tt u ra ta ) se la st ring a re stit u it a d a
readLine() non co rr is pond e a ll a si n ta ss i d i un nu m er o in te ro .
U n a eccez ion e non ca tt u ra ta si p ropaga ve rs o l’ es te rno , d i b lo cc o in b lo cc o : se ra gg iung e il m ai n , p rovo ca l’ abo rto d el p rog ra mm a.
Enrico Denti, Franco Zambonelli - ECCEZIONI IN JAVA4
C O S ’È UN ’E CC EZ IO N E
U n a eccez ion e è un ogg ett o , is ta n za d i java.lang.Throwable o d i un a qu al ch e su a so tt o cl ass e. In p ar ti co la re , le du e so tt o cl ass i p iù co m un i sono • java.lang.Exception • java.lang.Error
L a p ar o la “eccez ion e” è p er ò u su alm en te rif er it a a e n tr am b e.
U n Error ind ica p rob le mi re la ti v i al ca rica m en to d ell a c la ss i o al fun zi on am en to d ell a m acc h in a v ir tu al e Ja v a (e s. no t enough m em - o ry ), e v a c on si d er at o irr ec up er ab il e: p er ci ò non è d a ca ttu ra re .
U n a Exception , inv ece , ind ica d i so lit o sit u az ion i rec up er ab ili (e s: fin e fil e, ind ice d i un arr ay o lt re i limiti , err o ri d i i npu t, et c. ).
P o ic h é un ’eccez io n e è un ogg ett o , può con te n er e d ati o d ef in ir e m et od i: • tu tt e le eccez ion i d ef in is cono un m et odo getMessage() c h e re stit u is ce il m ess agg io d ’e rr o re a ss o ci at o all ’eccez ion e • al cun e eccez ion i d ef in is cono d ei ca m p i, co m e bytesTrans-
ferred in InterruptedIOException , ch e fo rn is cono u lt e- rio ri i n fo rm az ion i u tili p er m eg li o g es ti re la sit u az ion e.
R IL ANC IAR E E CC EZ IO N I Ja v a ric h ie d e c h e un m et odo en tr o cu i si può g en er ar e un ’eccez io - n e o g es ti sc a l’ ecce zi on e, con un co st ru tt o try / catch , opp u re d ic h ia ri d i ril a n ci a rl a a ll ’e st er n o d el m et o d o st ess o , co n la cl a u so la throws :
public int readInteger(BufferedReader in) throws IOException, NumberFormatException { return Integer.parseInt(in.readLine()); }
Enrico Denti, Franco Zambonelli - ECCEZIONI IN JAVA5