V tej vadnici se bomo s pomočjo primerov naučili obvladovanja več izjem v Javi.
Pred Java 7 smo morali napisati več kod za obdelavo izjem za različne vrste izjem, tudi če je bila odvečna.
Vzemimo primer.
Primer 1: Več blokov ulova
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException e) ( System.out.println(e.getMessage()); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Izhod
/ za nič
V tem primeru se lahko pojavita dve izjemi:
ArithmeticException
ker poskušamo število deliti z 0.ArrayIndexOutOfBoundsException
ker smo razglasili novo celoštevilsko matriko z mejami matrike od 0 do 9 in poskušamo indeksu dodeliti vrednost.
V obeh catch
blokih izpisujemo sporočilo o izjemi, tj. Podvojeno kodo.
Asociativnost operaterja dodelitve =
je od desne proti levi, zato ArithmeticException
se najprej vrne an s sporočilom / z ničlo.
Obravnavajte več izjem v bloku za ulov
V Java SE 7 in novejših različicah lahko zdaj v enem catch
bloku ujamemo več vrst izjem .
Vsaka izjema, ki jo lahko obravnava catch
blok, je ločena z navpično palico ali cevjo |
.
Njegova sintaksa je:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
Primer 2: Blok z več ulovi
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Izhod
/ za nič
Ulov več izjem v enem catch
bloku zmanjša podvajanje kode in poveča učinkovitost.
Bajtna koda, ustvarjena med prevajanjem tega programa, bo manjša od programa, ki ima več catch
blokov, saj ni odvečne kode.
Opomba: Če catch
blok obravnava več izjem, je parameter ulova implicitno final
. To pomeni, da za ulov parametrov ne moremo dodeliti nobenih vrednosti.
Osnova za lovljenje Izjema
Pri ulovu več izjem v enem catch
bloku je pravilo posplošeno na specializirano.
To pomeni, da če v catch
bloku obstaja hierarhija izjem , lahko ujamemo samo osnovno izjemo, namesto da bi ujeli več specializiranih izjem.
Vzemimo primer.
Primer 3: Ulov samo osnovnega razreda izjem
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception e) ( System.out.println(e.getMessage()); ) ) )
Izhod
/ za nič
Vemo, da so vsi razredi izjem podrazredi Exception
razreda. Namesto da bi ujeli več specializiranih izjem, lahko preprosto ujamemo Exception
razred.
Če je bil v catch
bloku že podan osnovni razred izjem, v istem catch
bloku ne uporabljajte podrejenih razredov izjem . V nasprotnem primeru bomo dobili napako pri prevajanju.
Vzemimo primer.
Primer 4: Ujeti osnovne in otroške razrede izjem
class Main ( public static void main(String() args) ( try ( int array() = new int(10); array(10) = 30 / 0; ) catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) ( System.out.println(e.getMessage()); ) ) )
Izhod
Main.java:6: napaka: Alternativ v stavku z več ulovi ni mogoče povezati s podrazvrstitvijo
V tem primeru, ArithmeticException
in ArrayIndexOutOfBoundsException
sta podrazredi v Exception
razredu. Tako dobimo napako pri sestavljanju.