Š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:
ArithmeticException
jo mēs cenšamies sadalīt skaitli ar 0.ArrayIndexOutOfBoundsException
jo 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 catch
blokos, ti, koda dublikātā.
Piešķiršanas operatora asociativitāte =
ir no labās uz kreiso pusi, tāpēc ArithmeticException
pirmais 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ā catch
blokā varam noķert vairāk nekā viena veida izņēmumus .
Katrs izņēmuma veids, ko var apstrādāt ar catch
bloku, 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ā catch
blokā 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 catch
blokiem, jo nav koda atlaišanas.
Piezīme: Ja catch
bloks 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ā catch
blokā, noteikums tiek vispārināts uz specializētu.
Tas nozīmē, ka, ja catch
blokā 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 Exception
klasi.
Ja catch
blokā jau ir norādīta pamata izņēmumu klase , neizmantojiet bērnu izņēmumu klases tajā pašā catch
blokā. 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ā ArithmeticException
un ArrayIndexOutOfBoundsException
abas ir Exception
klases apakšklases . Tātad, mēs saņemam kompilācijas kļūdu.