În acest tutorial, vom învăța să folosim cuvintele cheie throw și throws pentru tratarea excepțiilor, cu ajutorul exemplelor.
În Java, excepțiile pot fi clasificate în două tipuri:
- Excepții neverificate: Acestea nu sunt verificate la timpul compilării , dar la run-time.For exemplu:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, excepțiile prevăzute deError
clasă, etc. - Excepții verificate: sunt verificate la compilare. De exemplu,
IOException
,InterruptedException
etc.
Consultați Excepțiile Java pentru a afla detaliat despre excepțiile bifate și nebifate.
De obicei, nu este nevoie să gestionăm excepții necontrolate. Acest lucru se datorează faptului că excepțiile necontrolate apar din cauza erorilor de programare. Și, este o bună practică să le corectați în loc să le manipulați.
Acest tutorial se va concentra acum pe modul de gestionare a excepțiilor verificate folosind throw
și throws
.
Java aruncă cuvânt cheie
Folosim throws
cuvântul cheie în declarația metodei pentru a declara tipul de excepții care ar putea apărea în cadrul acesteia.
Sintaxa sa este:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
După cum puteți vedea din sintaxa de mai sus, putem folosi throws
pentru a declara mai multe excepții.
Exemplul 1: Java lansează cuvânt cheie
import java.io.*; class Main ( public static void findFile() throws IOException ( // code that may produce IOException File newFile=new File("test.txt"); FileInputStream stream=new FileInputStream(newFile); ) public static void main(String() args) ( try( findFile(); ) catch(IOException e)( System.out.println(e); ) ) )
Ieșire
java.io.FileNotFoundException: test.txt (Nu există un astfel de fișier sau director)
Când rulăm acest program, dacă fișierul test.txt
nu există, FileInputStream
aruncă un FileNotFoundException
care extinde IOException
clasa.
Dacă o metodă nu gestionează excepții, tipul de excepții care pot apărea în cadrul acesteia trebuie specificat în throws
clauză, astfel încât metodele de mai sus din stiva de apeluri să le poată gestiona sau să le specifice folosind throws
cuvântul cheie.
findFile()
Metoda specifică faptul că o IOException
pot fi aruncate. main()
Metoda numește această metodă și se ocupă de excepție în cazul în care este aruncată.
Aruncând multiple excepții
Iată cum putem arunca mai multe excepții folosind throws
cuvântul cheie.
import java.io.*; class Main ( public static void findFile() throws NullPointerException, IOException, InvalidClassException ( // code that may produce NullPointerException… … … // code that may produce IOException… … … // code that may produce InvalidClassException… … … ) public static void main(String() args) ( try( findFile(); ) catch(IOException e1)( System.out.println(e1.getMessage()); ) catch(InvalidClassException e2)( System.out.println(e2.getMessage()); ) ) )
Aici, findFile()
metoda specifică faptul că aceasta poate arunca NullPointerException
, IOException
și InvalidClassException
în ei throws
clauza.
Rețineți că nu am gestionat NullPointerException
. Acest lucru se datorează faptului că este o excepție necontrolată. Nu este necesar să o specificați în throws
clauză și să o gestionați.
aruncă cuvânt cheie Vs. încearcă … prinde … în cele din urmă
S-ar putea să existe mai multe metode care pot provoca excepții. Scrierea try… catch
pentru fiecare metodă va fi plictisitoare, iar codul devine lung și mai puțin lizibil.
throws
este util și atunci când ați bifat excepția (o excepție care trebuie tratată) pe care nu doriți să o prindeți în metoda dvs. curentă.
Cuvânt cheie Java throw
Cuvântul throw
cheie este folosit pentru a arunca în mod explicit o singură excepție.
Când se aruncă o excepție, fluxul de execuție a programului se transferă din try
bloc în catch
bloc. Folosim throw
cuvântul cheie într-o metodă.
Sintaxa sa este:
throw throwableObject;
Un obiect aruncabil este o instanță a clasei Throwable
sau subclasei Throwable
clasei.
Exemplul 2: cuvânt cheie Java throw
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Ieșire
Excepție în firul „principal” java.lang.ArithmeticException: Încercarea de a împărți la 0 la Main.divideByZero (Main.java:3) la Main.main (Main.java:7) starea de ieșire 1
În acest exemplu, aruncăm în mod explicit un ArithmeticException.
Notă: ArithmeticException
este o excepție nebifată. De obicei nu este necesar să se gestioneze excepțiile necontrolate.
Exemplul 3: Aruncare excepție verificată
import java.io.*; class Main ( public static void findFile() throws IOException ( throw new IOException("File not found"); ) public static void main(String() args) ( try ( findFile(); System.out.println("Rest of code in try block"); ) catch (IOException e) ( System.out.println(e.getMessage()); ) ) )
Ieșire
Fișierul nu a fost găsit
findFile()
Metoda aruncă o IOException
cu mesajul am trecut la constructorul acestuia.
Rețineți că, deoarece este o excepție verificată, trebuie să o specificăm în throws
clauză.
Metodele care apelează această findFile()
metodă trebuie fie să gestioneze această excepție, fie să o specifice folosind throws
cuvintele cheie.
Am tratat această excepție în main
()
metodă. Fluxul de execuție a programului se transferă din try
bloc în catch
bloc atunci când se aruncă o excepție. Deci, restul codului din try
bloc este omis și instrucțiunile din catch
bloc sunt executate.