Razlika između bacanja i bacanja u Javi

1. Uvod

U ovom uputstvu ćemo pogledati bacanje i baca na Javi. Objasnit ćemo kada bismo trebali koristiti svaki od njih.

Zatim ćemo pokazati nekoliko primjera njihove osnovne upotrebe.

2. Bacanje i Baca

Krenimo s brzim uvodom. Te su ključne riječi povezane s rukovanjem iznimkama. Iznimke se pojavljuju kada je poremećen normalan tijek naše aplikacije.

Razloga može biti puno. Korisnik može poslati pogrešne ulazne podatke. Možemo izgubiti vezu ili se može dogoditi druga neočekivana situacija. Rukovanje dobrim iznimkama ključ je da naša aplikacija radi nakon pojave tih neugodnih trenutaka.

Koristimo bacanje za izričito izbacivanje iznimke iz koda. To može biti bilo koja metoda ili statički blok. Ova iznimka mora biti podrazred od Bacljivo. Također, to može biti i Bacljivo sebe. Ne možemo izbaciti višestruke iznimke s jednim bacanje.

Baca ključna riječ može se staviti u deklaraciju metode. Označava koje se iznimke mogu izbaciti iz ove metode. Te se iznimke moramo nositi s try-catchom.

Ove dvije ključne riječi nisu zamjenjive!

3. Bacanje na Javi

Pogledajmo osnovni primjer s izbacivanjem iznimke od metode.

Prije svega, zamislite da pišemo jednostavan kalkulator. Jedna od osnovnih aritmetičkih operacija je dijeljenje. Zbog toga smo zamoljeni da implementiramo ovu značajku:

javna dvostruka podjela (double a, double b) {return a / b; }

Budući da ne možemo podijeliti s nulom, moramo dodati neke izmjene u naš postojeći kod. Čini se da je to dobar trenutak za stvaranje iznimke.

Napravimo to:

javno dvostruko dijeljenje (duplo a, dvostruko b) {if (b == 0) {baciti novo ArithmeticException ("Razdjelnik ne može biti jednak nuli!"); } povratak a / b; }

Kao što vidite, koristili smo ArithmeticException sa savršeno odgovara našim potrebama. Možemo proći jednu Niz parametar konstruktora koji je poruka o iznimci.

3.1. Dobre prakse

Uvijek bismo trebali preferirati najkonkretniju iznimku. Moramo pronaći razred koji najbolje odgovara našem iznimnom događaju. Na primjer, baciti NumberFormatException umjesto IlegalArgumentException. Trebali bismo izbjegavati bacanje nespecifičnog Iznimka.

Na primjer, postoji Cijeli broj razred u java.lang paket. Pogledajmo jednu izjavu tvorničke metode:

public static Integer valueOf (String s) baca NumberFormatException 

To je statička tvornička metoda koja stvara Cijeli broj primjer iz Niz. U slučaju pogrešnog unosa Niz, metoda će baciti NumberFormatException.

Dobra je ideja definirati vlastitu, opisniju iznimku. U našem Kalkulator razred koji bi mogao biti na primjer DivideByZeroException.

Pogledajmo primjere provedbe:

javna klasa DivideByZeroException proširuje RuntimeException {public DivideByZeroException (String message) {super (message); }}

3.2. Umotavanje postojeće iznimke

Ponekad postojeću iznimku želimo umotati u iznimku koju smo mi definirali.

Počnimo s definiranjem vlastite iznimke:

javna klasa DataAcessException proširuje RuntimeException {public DataAcessException (poruka niza, uzrok koji se može baciti) {super (poruka, uzrok); }}

Konstruktor uzima dva parametra: poruku o iznimci i uzrok koji može biti bilo koja podrazred Bacljivo.

Napišimo lažnu implementaciju za findAll () funkcija:

javni popis findAll () baca SQLException {baciti novi SQLException (); }

Sada, u SimpleService nazovimo funkciju spremišta, što može rezultirati SQLException:

javna void wrappingException () {try {personRepository.findAll (); } catch (SQLException e) {throw new DataAccessException ("SQL Exception", e); }}

Mi ponovno bacamo SQLException umotan u vlastitu iznimku zvanu DataAccessException. Sve se provjerava sljedećim testom:

@Test void whenSQLExceptionIsThrown_thenShouldBeRethrownWithWrappedException () {assertThrows (DataAccessException.class, () -> simpleService.wrappingException ()); }

Dva su razloga za to. Prije svega, koristimo umotavanje iznimki, jer ostatak koda ne mora znati za svaku moguću iznimku u sustavu.

Također komponente više razine ne trebaju znati o komponentama donje razine, niti o iznimkama koje izbacuju.

3.3. Multi-Catch s Javom

Ponekad metode koje koristimo mogu stvoriti mnoge različite iznimke.

Pogledajmo opsežniji blok try-catch:

isprobajte {tryCatch.execute (); } catch (ConnectionException | SocketException ex) {System.out.println ("IOException"); } catch (Iznimka ex) {System.out.println ("Opća iznimka"); }

The izvršiti metoda može donijeti tri iznimke: SocketException, ConnectionException, Exception. Uhvatit će prvi blok ulova ConnectionException ili SocketException. Ulovio bi drugi blok ulova Iznimka ili bilo koji drugi podrazred Iznimka. Zapamti to uvijek bismo prvo trebali uhvatiti detaljniju iznimku.

Možemo zamijeniti redoslijed blokova ulova. Tada nikad ne bismo ulovili SocketException i ConnectionException jer će sve ići u kvaku sa Iznimka.

4. Baca na Javi

Mi dodajemo baca deklaraciji metode.

Pogledajmo jednu od naših prethodnih deklaracija metode:

public static void execute () baca SocketException, ConnectionException, Exception

Metoda može izbaciti višestruke iznimke. Razdvajaju se zarezom na kraju deklaracije metode. I, provjerene i neprovjerene iznimke možemo staviti u baca. U nastavku smo opisali razliku između njih.

4.1. Označene i neprovjerene iznimke

Označena iznimka znači da je provjerena u vrijeme sastavljanja. Imajte na umu da se moramo nositi s ovom iznimkom. Inače, metoda mora navesti iznimku pomoću baca ključna riječ.

Najčešće provjerene iznimke su IOException, FileNotFoundException, ParseException. FileNotFoundException mogu biti bačeni kad stvaramo FileInputStream iz Datoteka.

Postoji kratki primjer:

Datoteka datoteke = nova datoteka ("not_existing_file.txt"); isprobajte {FileInputStream stream = new FileInputStream (datoteka); } catch (FileNotFoundException e) {e.printStackTrace (); }

Dodavanjem možemo izbjeći upotrebu try-catch bloka baca deklaraciji metode:

private static void un CheckException () baca FileNotFoundException {File file = new File ("not_existing_file.txt"); FileInputStream stream = novi FileInputStream (datoteka); }

Nažalost, funkcija više razine još se mora nositi s ovom iznimkom. Inače, ovu iznimku moramo staviti u deklaraciju metode s baca ključnu riječ.

Kao suprotno, neprovjerene iznimke ne provjeravaju se u vrijeme sastavljanja.

Najčešće neprovjerene iznimke su: ArrayIndexOutOfBoundsException, IllegalArgumentException, NullPointerException.

Neprovjerene iznimke bacaju se tijekom izvođenja. Sljedeći će kôd baciti a NullPointerException. Vjerojatno je to jedna od najčešćih iznimki u Javi.

Pozivanje metode na null referencu rezultirat će ovom iznimkom:

javna void runtimeNullPointerException () {Niz a = null; a.duljina (); }

Provjerimo ovo ponašanje u testu:

@Test void whenCalled_thenNullPointerExceptionIsThrown () {assertThrows (NullPointerException.class, () -> simpleService.runtimeNullPointerException ()); }

Imajte na umu da ovaj kod i test nemaju puno smisla. Jedino je u svrhu učenja objašnjenje izuzetaka tijekom izvođenja.

U Javi svaki podrazred Pogreška i RuntimeException je neprovjerena iznimka. Označena iznimka je sve ostalo pod Bacljivo razred.

5. Zaključak

U ovom smo članku razgovarali o razlici između dvije ključne riječi Java: bacanje i baca. Prošli smo kroz osnovnu uporabu i razgovarali malo o dobrim praksama. Tada smo razgovarali o provjerenim i neprovjerenim iznimkama.

Kao i uvijek, izvorni kod možete pronaći na našem GitHubu.

Ako želite dublje proučiti rukovanje iznimkama na Javi, pogledajte naš članak o Java iznimkama.