Šajā apmācībā mēs iemācīsimies rīkoties ar vairākiem Java izņēmumiem, izmantojot piemērus.
Pirms Java 7 mums bija jāraksta vairāki izņēmumu apstrādes kodi dažāda veida izņēmumiem, pat ja bija koda atlaišana.
Ņemsim piemēru.
1. piemērs: vairāki noķeršanas bloki
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()); ) ) )
Rezultāts
/ par nulli
Šajā piemērā var būt divi izņēmumi:
ArithmeticExceptionjo mēs cenšamies sadalīt skaitli ar 0.ArrayIndexOutOfBoundsExceptionjo mēs esam deklarējuši jaunu veselu skaitļu masīvu ar masīvu robežām no 0 līdz 9 un mēģinām piešķirt vērtību indeksam 10.
Mēs izdrukājam izņēmuma ziņojumu abos catchblokos, ti, koda dublikātā.
Piešķiršanas operatora asociativitāte =ir no labās uz kreiso pusi, tāpēc ArithmeticExceptionpirmais tiek izmests ar ziņojumu / ar nulli.
Rīkojieties ar vairākiem izņēmumiem ķeršanas blokā
Java SE 7 un jaunākās versijās mēs tagad vienā catchblokā varam noķert vairāk nekā viena veida izņēmumus .
Katrs izņēmuma veids, ko var apstrādāt ar catchbloku, tiek atdalīts, izmantojot vertikālu joslu vai cauruli |.
Tās sintakse ir:
try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block )
2. piemērs: vairāku nozveju bloķēšana
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()); ) ) )
Rezultāts
/ par nulli
Vairāku izņēmumu noķeršana vienā catchblokā samazina koda dublēšanos un palielina efektivitāti.
Baitkods, kas ģenerēts, sastādot šo programmu, būs mazāks nekā programmai ar vairākiem catchblokiem, jo nav koda atlaišanas.
Piezīme: Ja catchbloks apstrādā vairākus izņēmumus, nozvejas parametrs ir netieši final. Tas nozīmē, ka mēs nevaram piešķirt nevienu vērtību parametru uztveršanai.
Nozvejas bāzes izņēmums
Uztverot vairākus izņēmumus vienā catchblokā, noteikums tiek vispārināts uz specializētu.
Tas nozīmē, ka, ja catchblokā ir izņēmumu hierarhija , mēs varam noķert tikai bāzes izņēmumu, nevis noķert vairākus specializētus izņēmumus.
Ņemsim piemēru.
3. piemērs: tikai pamata izņēmuma klase
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()); ) ) )
Rezultāts
/ par nulli
Mēs zinām, ka visas izņēmuma klases ir klases apakšklases Exception. Tātad, tā vietā, lai noķertu vairākus specializētus izņēmumus, mēs varam vienkārši noķert Exceptionklasi.
Ja catchblokā jau ir norādīta pamata izņēmumu klase , neizmantojiet bērnu izņēmumu klases tajā pašā catchblokā. Pretējā gadījumā mēs iegūsim kompilācijas kļūdu.
Ņemsim piemēru.
4. piemērs: bāzes un bērnu izņēmuma nodarbību ķeršana
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()); ) ) )
Rezultāts
Main.java:6: kļūda: Alternatīvas paziņojumā par vairāku nozveju nevar saistīt pēc apakšklases
Šajā piemērā ArithmeticExceptionun ArrayIndexOutOfBoundsExceptionabas ir Exceptionklases apakšklases . Tātad, mēs saņemam kompilācijas kļūdu.








