Selles õpetuses õpime näidete abil viske ja visete märksõna kasutama erandite käsitlemiseks.
Java-s saab erandeid jagada kahte tüüpi:
- Märkimata Erandid: Nad ei ole kontrollitud kompileerimise tööajaga kuid joosta-time.For näiteks:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, erandeidError
klassi jne - Kontrollitud erandid: neid kontrollitakse kompileerimise ajal. Näiteks
IOException
,InterruptedException
jne
Kontrollitud ja kontrollimata erandite üksikasjaliku teabe saamiseks lugege Java erandeid.
Tavaliselt pole meil vaja kontrollimata erandeid käsitleda. Selle põhjuseks on kontrollimata erandite tekkimine programmeerimisvigade tõttu. Hea tava on nende parandamine selle asemel, et neid käsitseda.
Selles õpetuses keskendutakse nüüd kontrollitud erandite käsitsemisele throw
ja abil throws
.
Java viskab märksõna
Me kasutame throws
meetodi deklaratsioonis märksõna, et deklareerida selles sisalduvate erandite tüübid.
Selle süntaks on:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Nagu ülaltoodud süntaksist näete, saame kasutada throws
mitme erandi kuulutamiseks.
Näide 1: Java viskab märksõna
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); ) ) )
Väljund
java.io.FileNotFoundException: test.txt (sellist faili ega kataloogi pole)
Kui seda programmi käivitame test.txt
, FileInputStream
viskab faili , FileNotFoundException
mis laiendab IOException
klassi , kui faili pole olemas .
Kui meetod ei käsitle erandeid, tuleb throws
klauslis täpsustada selle sees esineda võivate erandite tüüp, nii et kõnepinu kõrgemal olevad meetodid saaksid neid käsitseda või throws
märksõna abil ise määrata .
findFile()
Meetod täpsustatakse, et IOException
võib visata. main()
Meetod nõuab see meetod ja käepidemed, välja arvatud juhul, kui see on visatud.
Mitme erandi viskamine
Siit saate teada, kuidas throws
märksõna abil mitu erandit teha .
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()); ) ) )
Siin findFile()
meetod täpsustatakse, et see võib visata NullPointerException
, IOException
ja InvalidClassException
selle throws
punkti.
Pange tähele, et me pole seda käsitsenud NullPointerException
. Seda seetõttu, et see on kontrollimata erand. Seda ei ole vaja throws
klauslis täpsustada ja käsitseda.
viskab märksõna Vs. proovige … püüdke … lõpuks
Erandeid võib põhjustada mitu meetodit. try… catch
Iga meetodi kirjutamine on tüütu ning kood muutub pikaks ja vähem loetavaks.
throws
on kasulik ka siis, kui olete kontrollinud erandit (erand, mida tuleb käsitleda), mida te ei soovi oma praeguses meetodis tabada.
Java viska märksõna
throw
Märksõna kasutatakse selgesõnaliselt visata ühe erandiga.
Erandi viskamisel kandub programmi täitmise voog try
plokist catch
plokki. throw
Märksõna kasutame meetodi sees.
Selle süntaks on:
throw throwableObject;
Viskatav objekt on klassi Throwable
või klassi alaklassi eksemplar Throwable
.
Näide 2: Java viska märksõna
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Väljund
Erand lõimes "main" java.lang.ArithmeticException: proovitakse jagada 0-ga aadressil Main.divideByZero (Main.java:3) juures Main.main (Main.java:7) väljumisolek 1
Selles näites viskame selgesõnaliselt ArithmeticException.
Märkus: ArithmeticException
on kontrollimata erand. Kontrollimata eranditega pole tavaliselt vaja tegeleda.
Näide 3: visatud kontrollitud erand
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()); ) ) )
Väljund
Faili ei leitud
findFile()
Meetod viskab IOException
sõnumiga me edasi oma ehitaja.
Pange tähele, et kuna see on kontrollitud erand, peame selle täpsustama throws
klauslis.
Meetodid, mis seda findFile()
meetodit kutsuvad, peavad kas selle erandi käsitsema või määrama selle throws
ise märksõna abil.
Oleme selle erandiga main
()
meetodis hakkama saanud. Programmi täitmise voog liigub try
plokist catch
plokki, kui visatakse erand. Niisiis, ülejäänud kood try
plokis jäetakse vahele ja catch
plokis olevad avaldused täidetakse.