JavaSvet - otvorena java zajednica

 
glavna stranica arr2javasvet  english version arr2java.net

Return iz catch i finally bloka

Igor Spasić
18 Maj 2004

Situacija u kojoj postoji return u catch i u finally bloku često zna da zbuni: koja se vrednost zaista vraća ako se javi exception? Sledeći primer ilustruje ovu situaciju:


public class ex {

   
public static int foo(boolean b) {
       
try {
           
if (b == true) {
               
throw new Exception("foo exception");
           
}
        }
catch (Exception e) {
           
return 1;
       
} finally {
           
return 2;
       
}
    }

   
public static void main(String args[]) {
       
System.out.println(foo(false));
        System.out.println
(foo(true));
   
}
}

Šta je rezultat rada ovog programa?

Rešenje

Prilikom kompajliranja gornjeg primera Sun-ov kompajler prijavljuje upozorenje (warning: finally clause cannot complete normally). Ono je sasvim na mestu, jer se za rezultat dobija sledeće:

2
2

Rezultat prvog poziva foo() metode je jasan. Prilikom drugog izvršavanja foo() metode generiše se exception i program dolazi u catch blok, gde se nalaže programu da se kao rezultat metode vrati vrednost 1. Međutim, u metodi postoji i finally blok koji mora da se izvrši u svakom slučaju! Program dakle nastavlja sa radom, što ovde znači da se posle return 1 izvršava return 2 iz finally bloka. Znači, rezultat drugog poziva foo() metode je isto 2.

Ukoliko se previdi upozorenje prilikom kompajliranja, gornji program neće raditi kako se očekuje. Isto tako, drugi java kompajleri uopšte ne prijavljuju bilo kakvo upozorenje, kao što je to slučaj sa jikes-om. Zato je poželjno gornji kod pisati na pravilniji način:

...
       
} catch (Exception e) {
           
return 1;
       
} finally {
           
...
       
}
       
return 2;
   
}
   
...

Rezultat ovako napisanog programa je:

2
1