Kuidas Java -erandeid õigesti käsitseda

Kuidas Java -erandeid õigesti käsitseda

Programmeerimise algajana mõiste erandite käsitlemine pea ümber keerutamine võib olla raske. Mitte, et kontseptsioon iseenesest oleks raske, kuid terminoloogia abil võib see tunduda arenenum kui see on. Ja see on nii võimas funktsioon, et see on altid väär- ja kuritarvitamisele.





Sellest artiklist saate teada, mis on erandid, miks need on olulised, kuidas neid kasutada ja milliseid vigu vältida. Enamikul kaasaegsetel keeltel on mingisugune erandite käsitlemine, nii et kui te kunagi Java -lt edasi lähete, võite enamiku neist näpunäidetest endaga kaasa võtta.





Java erandite mõistmine

Java, an erand on objekt, mis näitab teie rakenduse käitamise ajal midagi ebanormaalset (või 'erakordset'). Sellised erandid on visatud , mis põhimõtteliselt tähendab erandobjekti loomist (sarnaselt vigade „tõstmisega“).





Ilu on see, et saate saak visatud erandeid, mis võimaldab teil ebanormaalse olukorraga toime tulla ja lubada teie rakendusel edasi töötada, nagu poleks midagi valesti läinud. Näiteks kui nullkursor C -s võib teie rakenduse kokku kukkuda, võimaldab Java teil visata ja püüda

NullPointerException

s enne, kui nullmuutujal on võimalus krahhi põhjustada.



Pidage meeles, et erand on vaid objekt, kuid sellel on üks oluline omadus: seda tuleb laiendada

Exception

klass või mis tahes alamklass





Exception

. Kuigi Java-l on igasuguseid sisseehitatud erandeid, saate soovi korral luua ka oma. Mõned kõige levinumad Java erandid sisaldab:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Mis juhtub siis, kui teete erandi?





Esiteks otsib Java vahetut meetodit, et näha, kas on olemas kood, mis käsitleb teie tehtud erandit. Kui käitlejat pole olemas, vaatab see praegust meetodit kutsunud meetodit, et näha, kas käepide on seal olemas. Kui ei, siis vaadeldakse kutsutud meetodit seda meetod ja seejärel järgmine meetod jne. Kui erandit ei tabata, prindib rakendus virnajälje ja jookseb seejärel kokku. (Tegelikult on see nüansirikkam kui lihtsalt krahh, kuid see on arenenud teema, mis jääb väljapoole selle artikli ulatust.)

TO virnajälg on nimekiri kõigist meetoditest, mille Java läbis, otsides erandite käitlejat. Pinu jälg näeb välja selline:

Exception in thread 'main' java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Me võime sellest palju välja lugeda. Esiteks oli visatud erand a

NullPointerException

. See toimus aastal

getTitle()

meetod Book.java 16. real. See meetod kutsuti

getBookTitles()

Autor.java 25. real. See meetod kutsuti

main()

Bootstrap.java 14. real. Nagu näete, lihtsustab silumine seda kõike.

Kuid jällegi, erandite tõeline eelis on see, et saate ebanormaalse olukorraga hakkama saada, haarates erandi, seadistades asjad ja jätkates rakendust krahhita.

Java erandite kasutamine koodis

Oletame, et teil on

someMethod()

mis võtab täisarvu ja täidab loogikat, mis võib puruneda, kui täisarv on väiksem kui 0 või suurem kui 100. See võib olla hea koht erandi tegemiseks:

kuidas ühendada kaks fotot
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Selle erandi tabamiseks peate minema kuhugi

someMethod()

nimetatakse ja kasutage proovige püüda :

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}

Kõik piires proovige plokk käivitub järjekorras, kuni ilmub erand. Niipea kui erand tehakse, jäetakse kõik järgnevad avaldused vahele ja rakenduse loogika hüppab kohe saak blokeerida.

Meie näites sisestame proovibloki ja helistame kohe

someMethod()

. Kuna 200 ei ole vahemikus 0 kuni 100, siis an

IllegalArgumentException

visatakse. See lõpetab viivitamatult täitmise

someMethod()

, jätab ülejäänud loogika prooviblokis vahele (

someOtherMethod()

ei kutsuta kunagi) ja jätkab täitmist blokeerimisploki piires.

Mis juhtuks, kui me helistaksime

someMethod(50)

hoopis? The

IllegalArgumentException

ei viskaks kunagi.

someMethod()

täidaks nagu tavaliselt. Prooviblokk toimiks nagu tavaliselt, helistades

someOtherMethod()

kui someMethod () on lõpule jõudnud. Millal

someOtherMethod()

lõpeb, jäetakse püügiplokk vahele ja

callingMethod()

jätkaks.

Pange tähele, et katseploki kohta võib olla mitu püügiplokki:

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}

Pange tähele ka seda, et see on valikuline lõpuks plokk on ka olemas:

public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}

Lõpliku ploki kood on alati hukati ükskõik mida. Kui proovimisplokis on tagasisaatmislause, täidetakse lõplik plokk enne meetodist naasmist. Kui viskate püügiplokki veel ühe erandi, täidetakse viimane plokk enne erandi viskamist.

Lõplikku plokki peaksite kasutama siis, kui teil on objekte, mis tuleb enne meetodi lõppu puhastada. Näiteks kui avasite prooviblokis faili ja viskasite hiljem erandi, võimaldab viimane plokk faili enne meetodist lahkumist sulgeda.

Pange tähele, et teil võib olla lõplik plokk ilma püügiplokita:

public void method() {
try {
// ...
} finally {
// ...
}
}

See võimaldab teil teha kõik vajalikud puhastustööd, lubades samal ajal visatud eranditel levitada meetodi kutsumispinu (st te ei soovi siin erandit käsitleda, kuid peate siiski kõigepealt puhastama).

Märgitud ja märkimata erandid Java -s

Erinevalt enamikust keeltest eristab Java kontrollitud erandid ja kontrollimata erandid (nt C# -l on ainult märkimata erandid). Kontrollitud erand peab olla kinni meetodis, kus erand visatakse, muidu koodi ei kompileerita.

Märgistatud erandi loomiseks laiendage alates

Exception

. Kontrollimata erandi loomiseks laiendage alates

RuntimeException

.

Iga meetod, mis loob kontrollitud erandi, peab seda tähistama meetodi allkirjas, kasutades viskab märksõna. Kuna Java on sisseehitatud

IOException

on märgitud erand, järgmist koodi ei kompileerita:

public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Kõigepealt peate teatama, et see loob kontrollitud erandi:

public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Pange tähele, et meetodit võib kuulutada erandina, kuid mitte kunagi visata erandit. Sellegipoolest tuleb erand kinni püüda või muidu koodi ei kompileerita.

Millal peaksite kasutama kontrollitud või märkimata erandeid?

Ametlikus Java dokumentatsioonis on selle küsimuse lehel . See võtab erinevuse kokku lühikese rusikareegliga: „Kui võib eeldada, et klient toibub erandist, tehke see kontrollitud erandiks. Kui klient ei saa erandist taastumiseks midagi ette võtta, tehke see märkimata erandiks. '

Kuid see juhend võib olla aegunud. Ühelt poolt annavad kontrollitud erandid tulemuseks tugevama koodi. Teisest küljest pole ükski teine ​​keel kontrollinud erandeid samal viisil kui Java, mis näitab kahte asja: esiteks pole see funktsioon piisavalt kasulik, et teised keeled seda varastada, ja kaks, saate ilma nendeta elada. Lisaks ei mängi kontrollitud erandid Java 8 -s kasutusele võetud lambda -avaldistega kenasti.

Juhised Java erandite kasutamiseks

Erandid on kasulikud, kuid kergesti kuritarvitatavad. Siin on mõned näpunäited ja parimad tavad, mis aitavad vältida nende segadust.

  • Eelistage üldistele eranditele konkreetseid erandeid. Kasutage | _+_ | üle | _+_ | kui võimalik, kasutage muidu | _+_ | üle | _+_ | kui võimalik.
  • Ärge kunagi püüdke | _+_ | ! | _+_ | klass tegelikult laieneb | _+_ | , ja püügiplokk tegelikult töötab koos | _+_ | või mis tahes klass, mis laiendab viskamist. Kuid | _+_ | klass laieneb ka | _+_ | , ja te ei taha kunagi | _+_ | püüda sest | _+_ | viitavad tõsistele parandamatutele probleemidele.
  • Ärge kunagi püüdke | _+_ | ! | _+_ | laieneb | _+_ | , seega kõik plokid, mis püüavad kinni | _+_ | püüab ka | _+_ | , ja see on väga oluline erand, millega te ei taha jama (eriti mitme lõimega rakendustes), kui te ei tea, mida teete. Kui te ei tea, millist erandit püüda, kaaluge mitte midagi püüdmist.
  • Silumise hõlbustamiseks kasutage kirjeldavaid sõnumeid. Kui teete erandi, saate sisestada | _+_ | sõnum kui argument. Sellele teatele pääseb juurde püügiplokis, kasutades | _+_ | meetodit, kuid kui erandit kunagi ei tabata, kuvatakse teade ka virnajälje osana.
  • Püüdke erandeid mitte tabada ja ignoreerida. Kontrollitud erandite ebamugavuste vältimiseks seadistavad paljud algajad ja laisad programmeerijad püügiploki, kuid jätavad selle tühjaks. Halb! Käsitlege seda alati graatsiliselt, kuid kui te ei saa, printige vähemalt virnajälg välja, et saaksite teada, et erand on visatud. Seda saate teha, kasutades | _+_ | meetod.
  • Hoiduge erandite liigsest kasutamisest. Kui teil on haamer, näeb kõik välja nagu nael. Kui te esimest korda eranditest teada saate, võite tunda, et olete kohustatud muutma kõik erandiks ... nii kaugele, et enamus teie rakenduse juhtimisvoost taandub erandite käsitlemisele. Pidage meeles, et erandid on mõeldud erandlikeks juhtumiteks!

Nüüd peaksite olema eranditega piisavalt mugav, et mõista, mis need on, miks neid kasutatakse ja kuidas neid oma koodi lisada. Kui te kontseptsioonist täielikult aru ei saa, pole midagi! Mul kulus natuke aega, kuni see mu peas 'klõpsatas', nii et ärge tundke, et peate sellega kiirustama. Võta aega.

Kas teil on küsimusi? Kas teate muid eranditega seotud näpunäiteid, millest ma ilma jäin? Jagage neid allolevates kommentaarides!

Jaga Jaga Piiksuma E -post Kuidas luua andmevoo diagrammi mis tahes projekti andmete visualiseerimiseks

Mis tahes protsessi andmevooskeemid (DFD) aitavad teil mõista, kuidas andmed voolavad allikast sihtkohta. Siin on, kuidas seda luua!

Loe edasi
Seotud teemad
  • Programmeerimine
  • Java
Autori kohta Joel Lee(Avaldatud 1524 artiklit)

Joel Lee on MakeUseOfi peatoimetaja alates 2018. aastast. Tal on B.S. infotehnoloogia erialal ning üle üheksa -aastase erialase kirjutamis- ja toimetamiskogemuse.

mängud, millele saate teksti saata
Veel Joel Lee'lt

Telli meie uudiskiri

Liituge meie uudiskirjaga, et saada tehnilisi näpunäiteid, ülevaateid, tasuta e -raamatuid ja eksklusiivseid pakkumisi!

Tellimiseks klõpsake siin