Undantekningar frá Java og hvernig á að meðhöndla þær

Sem Java verktaki ættir þú að hafa góða þekkingu á Java undantekningum og meðhöndlun undantekninga.

Þessi kennsla veitir grunnþekkingu sem hver forritari verður að hafa þegar unnið er með Java forrit. Til að byrja með skulum við byrja á því að skilja hvað nákvæmlega Java-undantekningar eru.



Hvað eru Java undantekningar

Java forrit getur lent í vandræðum sem leiða til þess að forritinu er skyndilega hætt meðan á því stendur. Þessi vandamál eru kölluð undantekningar.


Góður forritari ætti að vera fær um að þekkja villurnar sem geta komið fram við framkvæmdina og bjóða upp á aðrar leiðir sem forritið getur tekið ef slíkar undantekningar eru gerðar. Þessi framkvæmd er kölluð undantekningarmeðferð.

Nú gætir þú verið að velta fyrir þér af hverju þurfum við yfirleitt undantekningar meðhöndlun. Af hverju ekki að skrifa forrit sem ekki henda undantekningum?




Hvers vegna þurfum við meðhöndlun undantekninga

Eins og gefur að skilja er að skrifa forrit sem ekki henda undantekningum ekki eins auðvelt og það hljómar. Oftast eru þessar óhjákvæmilegu villur ekki á valdi forritarans.



Forrit sem samþykkja notandainntak eru tilhneigingu til að lenda í undantekningum vegna ógilds innsláttar sem notandinn leggur fram. Svo er að lesa utanaðkomandi skrár miðað við líkurnar á að þær hafi verið færðar, endurnefnt eða eytt af utanaðkomandi aðila án vitundar forritarans.

Í slíkum tilvikum verður forritið að geta höndlað undantekninguna á tignarlegan hátt án þess að ljúka framkvæmdinni.



Stigveldi undantekninga frá Java

Allar undantekningarnar í Java ættu að vera barn Exception bekk, sem sjálft er barn Throwable bekk.


Tveir aðalundirflokkar Exception bekkur eru RuntimeException og IOException.



Undantekning vs villa

Annar barnaflokkur Throwable bekkur er Error bekk. Villur eru þó frábrugðnar undantekningum.

Villur benda til vandamála sem JVM gæti lent í meðan á framkvæmd stendur. Þessi vandamál eru yfirleitt mikilvæg og óafturkræf. Minni leki og ósamrýmanleiki bókasafna eru algengar ástæður fyrir villum í forritum.

StackOverflowError og OutOfMemoryError eru tvö dæmi um Java villur.




Athugaðar og ómerktar undantekningar

Við getum skipt Java-undantekningum í tvo meginflokka: athugað og ómerkt undantekningar.

Athugaðar undantekningar eru þær undantekningar sem þarf að meðhöndla í forritinu áður en þær eru teknar saman. Ef ekki er farið með þessar undantekningar verður forritið ekki tekið saman af Java þýðandanum. Þess vegna eru þetta einnig kallaðar undantekningar um samantektartíma. IOExceptions eru góð dæmi um merktar undantekningar.

Ómerktar undantekningar eru þær undantekningar sem þýðandinn hunsar við samningu forritsins. Hvort við höfum höndlað þessar undantekningar í forritinu eða ekki skiptir ekki máli hvenær forritið er tekið saman. Þar sem meðhöndlun undantekninga er ekki lögð á þessar undantekningar getur forritið okkar lent í RuntimeExceptions sem leiðir til lokunar áætlunar.

Allir flokkarnir sem lengja RuntimeException bekkur eru ómerktar undantekningar. Tvö dæmi um slíka flokka eru NullPointerException og ArrayIndexOutOfBoundsException.




Algengar aðferðir í undanþáguflokki

Við munum fara í gegnum nokkrar algengar aðferðir í Java Exception bekkur:

  1. getMessage: skilar skilaboðum sem innihalda upplýsingar um undantekningu sem átti sér stað.
  2. printStackTrace: skilar stafla ummerki undantekningarinnar.
  3. toString: skilar heiti bekkjarins og skilaboðunum sem skilað er með getMessage aðferð.


Hvernig á að meðhöndla undantekningar

Við skulum sjá hvernig við getum séð um undantekningar á Java:

reyna-grípa

Við getum náð undantekningum og meðhöndlað þær almennilega með því að nota a reyna-grípa loka á Java.

Í þessari setningafræði er sá hluti kóðans sem hefur tilhneigingu til að henda undantekningu settur inn í reynibálk og aflabálkurinn / kubbarnir ná kastaðri undantekningu / undantekningum og meðhöndla þær samkvæmt rökfræði sem við bjóðum upp á.


Grunn setningafræði try-catch blokkar er eftirfarandi:

try {
//exception-prone code } catch(Exception e) {
//error handling logic }

Með þessari nálgun stöðvar forritið ekki framkvæmd þegar undantekning er kastað af forritinu, heldur er henni þokkalega meðhöndlað.

Við munum sjá hvernig á að meðhöndla IOExceptions kastað af FileReader bekk í Java forriti.

Dæmi:

import java.io.FileReader; public class TryCatchBlockExample {
public static void main(String[] args) {

try {

FileReader file = new FileReader('source.txt');

file.read();
}
catch(Exception e) {

e.printStackTrace();
}
} }

Hér höfum við notað einn aflablokk til að takast á við FileNotFoundException kastað þegar | | + _ | bekk og FileReader kastað af IOException aðferð við read() bekk.

Báðar þessar undantekningar eru börn FileReader bekk.

Við getum einnig notað margar aflayfirlýsingar til að ná í mismunandi tegundir af villum sem kóðinn hefur kastað inn í yfirlýsingunni um eina tilraun. Fyrir fyrra dæmið getum við notað einn aflablokk til að ná Exception og önnur veiðiblokk fyrir FileNotFoundException eins og eftirfarandi kóðabút sýnir:

IOException

Ef kastað undantekning samsvarar undantekningunni sem fyrsta aflayfirlýsingin hefur meðhöndlað, þá er hún meðhöndluð af rökfræðinni í fyrstu aflayfirlýsingunni.

Ef undantekningarnar passa ekki saman færist það til annarrar aflayfirlýsingar. Ef aflayfirlýsingar eru fleiri en tvær heldur þetta ferli áfram þar til undantekningin nær aflayfirlýsingu sem veiðir gerð þess.

Síðan import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class TryCatchBlockExample {
public static void main(String[] args) {

try {

FileReader file = new FileReader('source.txt');

file.read();

file.close();
}
catch(FileNotFoundException e) {

e.printStackTrace();
}
catch(IOException e) {

e.printStackTrace();
}
} }
er undirtegund af FileNotFoundException, með 2. aflayfirlýsingu til að ná a IOException mun ekki virka. Það verður afgreitt með fyrstu aflayfirlýsingu og nær aldrei 2. yfirlýsingu.

Athugið:Það er skylda að nota að minnsta kosti eina aflayfirlýsingu með tilraunayfirlýsingu.

loksins

Þegar við notum a reyna-grípa loka til að ná undantekningum í forritinu okkar, það eru dæmi um að við viljum innleiða einhverja rökfræði þrátt fyrir hvort undantekning hafi verið veidd eða ekki. Í slíkum tilvikum getum við notað a reyna-grípa-loksins loka í staðinn fyrir bara a reyna-grípa loka.

Síðan, kóðinn inni í FileNotFoundException staðhæfing er framkvæmd hvort sem undantekning á sér stað eða ekki. The finally yfirlýsing ætti alltaf að koma í lok try-catch-loks blokkarinnar.

Til dæmis þegar við notum finally bekk að lesa skrá er nauðsynlegt að loka opnu skránni í lok vinnslu hvort sem undantekning á sér stað eða ekki. Til að tryggja þetta getum við sett kóðann til að loka skránni inni í FileReader yfirlýsing.

finally

Ef þú reynir hins vegar að setja saman ofangreindan kóða verður kóðinn ekki tekinn saman vegna ómeðhöndlaðs import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class TryCatchFinallyBlockExample {
public static void main(String[] args) {
FileReader file = null;
try {

file = new FileReader('source.txt');

file.read();
}
catch(FileNotFoundException e) {

e.printStackTrace();
}
catch(IOException e) {

e.printStackTrace();
}
finally {

file.close();
}
} }
Þetta er vegna þess að IOException aðferð við close() bekkur getur líka hent FileReader. Þannig að við verðum að setja þennan hluta í annan svona reyniblokk:

IOExceptions

kastar

Meðhöndlunarvillur með import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class TryCatchFinallyBlockExample {
public static void main(String[] args) {
FileReader file = null;

try {

file = new FileReader('source.txt');

file.read();
}
catch(FileNotFoundException e) {

e.printStackTrace();
}
catch(IOException e) {

e.printStackTrace();
}
finally {

try {


file.close();

}

catch(IOException e) {


e.printStackTrace();

}
}
} }
leitarorð í Java er einfalt. Reyndar, í þessari nálgun höndlarðu ekki raunverulega undantekninguna á þeim stað sem hún kemur fyrir. Í staðinn hentum við undantekningunni frá núverandi aðferð við aðferðina sem kallaði núverandi aðferð. Síðan verður afhending skekkjunnar á ábyrgð ytri aðferðarinnar.

Til að henda undantekningu úr aðferð þarftu einfaldlega að lýsa því yfir að þessi aðferð kunni að henda þeirri undantekningu sem talin er. Við skulum sjá hvernig við getum höndlað throws kastað af IOExceptions bekk með þessari nálgun.

Dæmi:

FileReader

kasta

Ólíkt öðrum aðferðum á þessum lista er import java.io.FileReader; import java.io.IOException; public class ThrowsExample {
public void readFile throws IOException {
FileReader file = new FileReader('source.txt');
file.read();
file.close();
} }
leitarorð er ekki notað til að höndla villur. En þar sem flestir rugla saman throw lykilorð með throw leitarorð, við héldum að best væri að ræða það hér.

The throws leitarorð er notað til að kalla sérstaklega fram undantekningu. Við getum hent nýundarlausri undantekningu eða undantekningu sem lent var í aðferðinni.

throw

Notendaskilgreindar undantekningar

Auk þess að nota innbyggðar Java undantekningar geturðu skilgreint þínar eigin undantekningar. Þú getur skilgreint þær sem annaðhvort merktar eða ómerktar undantekningar. Til að búa til nýja merkta undantekningu ætti nýja undantekningin þín að framlengja public class ThrowExample {
public void invalidate(int amount) throws Exception {
if (amount < 500) {

throw new Exception('Amount not sufficient');
}
} }
bekk.

Til að búa til ómerkt undantekning, lengja Exception bekk.

Í eftirfarandi kóðadæmi höfum við búið til notendaskilgreinda undantekningu:

RuntimeException

Nú getum við notað ofangreinda undantekningu innan forritarökfræðinnar okkar svona:

public class InvalidLengthException extends Exception {
private int length;
private String message;
public InvalidLengthException(int length, String message) {
this.length=length;
this.message=message;
}
public int getAmount() {
return this.length;
}
public String getMessage() {
return this.message;
} }

Ef við athugum lengd strengsins með public class InputChecker {
private int minLength;
private int maxLength;
public InputChecker(int minLength, int maxLength) {
this.minLength=minLength;
this.maxLength=maxLength;
}
public void checkStringLength(String strInput) throws InvalidLengthException {
int strLength = strInput.length();
if (strLength maxLength){

throw new InvalidLengthException(strLength, 'Input should have maximum '+maxLength+' character');
}
} }
bekk mun það henda InputChecker ef strengslengd er undir lágmarkslengd eða yfir hámarkslengd.

InvalidLengthException

Þegar við keyrum ofangreindan kóðaúthlut mun það henda public class Main {
public static void main(String[] args) {
InputChecker ic = new InputChecker(2, 7);
try {

ic.checkStringLength('longer than the maximum length');
}
catch(InvalidLengthException e) {

e.printStackTrace();
}
} }
og við munum fá eftirfarandi framleiðslu:

InvalidLengthException

Niðurstaða

Í þessari leiðbeiningu gáfum við þér skjóta og hnitmiðaða kynningu á Java undantekningum. Við vonum að þú hafir nú góðan skilning á því hvað eru undantekningar og hvernig á að meðhöndla þær í Java forritinu þínu.