Šajā apmācībā mēs iemācīsimies izmantot metienu un metienu atslēgvārdu izņēmumu apstrādei, izmantojot piemērus.
Java izņēmumus var iedalīt divos veidos:
- Neatzīmētajās Izņēmumi: Tie nav pārbaudīti kompilēšanas laikā, bet palaist-time.For piemēram
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, izņēmumi saskaņā arError
klasi, utt - Pārbaudītie izņēmumi: tie tiek pārbaudīti sastādīšanas laikā. Piemēram,
IOException
,InterruptedException
uc
Skatiet Java izņēmumus, lai detalizēti uzzinātu par pārbaudītiem un nepārbaudītiem izņēmumiem.
Parasti mums nav jārīkojas ar nepārbaudītiem izņēmumiem. Tas ir tāpēc, ka nepārbaudīti izņēmumi rodas programmēšanas kļūdu dēļ. Tā ir laba prakse tos labot, nevis rīkoties.
Šajā apmācībā tagad galvenā uzmanība tiks pievērsta tam, kā rīkoties ar pārbaudītajiem izņēmumiem, izmantojot throw
un throws
.
Java met atslēgvārdu
throws
Metodes deklarācijā mēs izmantojam atslēgvārdu, lai paziņotu, kādi izņēmumi tajā varētu rasties.
Tās sintakse ir:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Kā redzat no iepriekš minētās sintakses, mēs varam izmantot throws
vairāku izņēmumu deklarēšanai.
1. piemērs: Java iemet atslēgvārdu
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); ) ) )
Rezultāts
java.io.FileNotFoundException: test.txt (nav šāda faila vai direktorija)
Kad palaižam šo programmu, ja fails test.txt
neeksistē, FileInputStream
met a, FileNotFoundException
kas paplašina IOException
klasi.
Ja metode neizskata izņēmumus, throws
klauzulā ir jānorāda tajā iespējamo izņēmumu veids, lai zvanu kaudzē augšpusē esošās metodes tos varētu apstrādāt vai norādīt, izmantojot throws
pašas atslēgvārdu.
findFile()
Metode nosaka, ka IOException
var tikt izmesti. main()
Metode prasa šo metodi un rokturi izņēmumu, ja tas ir izmet.
Izmetot vairākus izņēmumus
Lūk, kā mēs varam izmest vairākus izņēmumus, izmantojot throws
atslēgvārdu.
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()); ) ) )
Lūk, tad findFile()
metode ir noteikts, ka tā var mest NullPointerException
, IOException
un InvalidClassException
tās throws
punktā.
Ņemiet vērā, ka mēs neesam apstrādājuši NullPointerException
. Tas ir tāpēc, ka tas ir nepārbaudīts izņēmums. Nav nepieciešams to norādīt throws
klauzulā un rīkoties ar to.
izmet atslēgvārdu Vs. mēģini … noķert … beidzot
Var būt vairākas metodes, kas var izraisīt izņēmumus. try… catch
Katras metodes rakstīšana būs garlaicīga, un kods kļūst garš un mazāk lasāms.
throws
ir noderīgs arī tad, ja esat atzīmējis izņēmumu (izņēmums, kas jāizskata), kuru nevēlaties noķert pašreizējā metodē.
Java mest atslēgvārds
throw
Atslēgvārds tiek izmantots, lai nepārprotami mest vienu izņēmumu.
Kad tiek izmests izņēmums, programmas izpildes plūsma pāriet no try
bloka uz catch
bloku. throw
Atslēgvārdu mēs izmantojam metodes ietvaros.
Tās sintakse ir:
throw throwableObject;
Metams objekts ir klases Throwable
vai klases apakšklases gadījums Throwable
.
2. piemērs: Java mest atslēgvārds
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Rezultāts
Izņēmums pavedienā "main" java.lang.ArithmeticException: mēģina sadalīt ar 0 vietnē Main.divideByZero (Main.java:3) pie Main.main (Main.java:7) izejas statusa 1
Šajā piemērā mēs skaidri izsakām ArithmeticException.
Piezīme: ArithmeticException
ir nepārbaudīts izņēmums. Parasti nav nepieciešams rīkoties ar nepārbaudītiem izņēmumiem.
3. piemērs: izmestais izņēmums
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()); ) ) )
Rezultāts
Fails nav atrasts
findFile()
Metode met IOException
ar ziņu, mēs nodots tā konstruktors.
Ņemiet vērā, ka, tā kā tas ir pārbaudīts izņēmums, mums tas jānorāda throws
klauzulā.
Metodēm, kas izsauc šo findFile()
metodi, ir jāapstrādā šis izņēmums vai arī jānorāda, izmantojot throws
pašu atslēgvārdu.
Mēs esam apstrādājuši šo izņēmumu main
()
metodē. Programmas izpildes plūsma pāriet no try
bloka uz catch
bloku, kad tiek izmests izņēmums. Tātad pārējais try
bloka kods tiek izlaists un catch
blokā esošie paziņojumi tiek izpildīti.