Java viskab ja viskab märksõna

Lang L: none (table-of-contents)

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, erandeid Errorklassi jne
  • Kontrollitud erandid: neid kontrollitakse kompileerimise ajal. Näiteks IOException, InterruptedExceptionjne

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 throwja abil throws.

Java viskab märksõna

Me kasutame throwsmeetodi 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 throwsmitme 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, FileInputStreamviskab faili , FileNotFoundExceptionmis laiendab IOExceptionklassi , kui faili pole olemas .

Kui meetod ei käsitle erandeid, tuleb throwsklauslis täpsustada selle sees esineda võivate erandite tüüp, nii et kõnepinu kõrgemal olevad meetodid saaksid neid käsitseda või throwsmärksõna abil ise määrata .

findFile()Meetod täpsustatakse, et IOExceptionvõ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 throwsmä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, IOExceptionja InvalidClassExceptionselle throwspunkti.

Pange tähele, et me pole seda käsitsenud NullPointerException. Seda seetõttu, et see on kontrollimata erand. Seda ei ole vaja throwsklauslis täpsustada ja käsitseda.

viskab märksõna Vs. proovige … püüdke … lõpuks

Erandeid võib põhjustada mitu meetodit. try… catchIga 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

throwMärksõna kasutatakse selgesõnaliselt visata ühe erandiga.

Erandi viskamisel kandub programmi täitmise voog tryplokist catchplokki. throwMärksõna kasutame meetodi sees.

Selle süntaks on:

 throw throwableObject;

Viskatav objekt on klassi Throwablevõ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 IOExceptionsõnumiga me edasi oma ehitaja.

Pange tähele, et kuna see on kontrollitud erand, peame selle täpsustama throwsklauslis.

Meetodid, mis seda findFile()meetodit kutsuvad, peavad kas selle erandi käsitsema või määrama selle throwsise märksõna abil.

Oleme selle erandiga main()meetodis hakkama saanud. Programmi täitmise voog liigub tryplokist catchplokki, kui visatakse erand. Niisiis, ülejäänud kood tryplokis jäetakse vahele ja catchplokis olevad avaldused täidetakse.

Huvitavad Artiklid...