logo

Poikkeukset Javassa

Poikkeuskäsittely Javassa on yksi tehokkaista tavoista käsitellä ajonaikaisia ​​virheitä, jotta sovelluksen säännöllinen kulku voidaan säilyttää. Java Exception Handling on mekanismi, joka käsittelee ajonaikaisia ​​virheitä, kuten ClassNotFoundException, IOException, SQLException, RemoteException jne.

Mitä ovat Java-poikkeukset?

Javassa poikkeus on ei-toivottu tai odottamaton tapahtuma, joka tapahtuu ohjelman suorituksen aikana eli ajon aikana, joka häiritsee ohjelman käskyjen normaalia kulkua. Ohjelma voi ottaa kiinni ja käsitellä poikkeuksia. Kun menetelmässä tapahtuu poikkeus, se luo objektin. Tätä objektia kutsutaan poikkeusobjektiksi. Se sisältää tietoja poikkeuksesta, kuten poikkeuksen nimen ja kuvauksen sekä ohjelman tilan poikkeuksen tapahtuessa.



Tärkeimmät syyt poikkeuksen esiintymiseen

  • Virheellinen käyttäjän syöte
  • Laitteen vika
  • Verkkoyhteyden katkeaminen
  • Fyysiset rajoitukset (levyn ulkopuolinen muisti)
  • Koodivirheet
  • Avataan tiedosto, joka ei ole käytettävissä

Virheet edustavat peruuttamattomia olosuhteita, kuten Java-virtuaalikoneen (JVM) muistin loppuminen, muistivuotoja, pinon ylivuotovirheitä, kirjastojen yhteensopimattomuutta, ääretöntä rekursiota jne. Virheet eivät yleensä ole ohjelmoijan hallinnassa, eikä meidän pitäisi yrittää käsitellä virheitä.

Ero virheen ja poikkeuksen välillä

Keskustellaanpa tärkeimmästä osasta, joka on erot virheen ja poikkeuksen välillä eli näin:

  • Virhe: Virhe tarkoittaa vakavaa ongelmaa, jota järkevän sovelluksen ei pitäisi yrittää saada kiinni.
  • Poikkeus: Poikkeus osoittaa olosuhteet, joita järkevä sovellus saattaa yrittää saada kiinni.

Poikkeushierarkia

Kaikki poikkeus- ja virhetyypit ovat luokan alaluokkia Heitettävä , joka on hierarkian perusluokka. Yhtä haaraa johtaa Poikkeus . Tätä luokkaa käytetään poikkeuksellisiin olosuhteisiin, jotka käyttäjäohjelmien tulisi saada kiinni. NullPointerException on esimerkki tällaisesta poikkeuksesta. Toinen haara, Virhe käytetään Java-ajonaikaisessa järjestelmässä ( JVM ) osoittamaan virheitä, jotka liittyvät itse ajonaikaiseen ympäristöön (JRE). StackOverflowError on esimerkki tällaisesta virheestä.



Poikkeushierarkia Javassa

Java-poikkeushierarkia

Poikkeustyypit

Java määrittelee useita poikkeuksia, jotka liittyvät sen eri luokkakirjastoihin. Java antaa käyttäjille myös mahdollisuuden määritellä omat poikkeuksensa.

tyyppisiä poikkeuksia Javassa

Poikkeukset voidaan luokitella kahdella tavalla:



  1. Sisäänrakennetut poikkeukset
    • Tarkistettu poikkeus
    • Valitsematon poikkeus
  2. Käyttäjän määrittämät poikkeukset

Puhutaanpa edellä määritellystä poikkeuksesta, joka on seuraava:

1. Sisäänrakennetut poikkeukset

Sisäänrakennetut poikkeukset ovat Java-kirjastoissa saatavilla olevia poikkeuksia. Nämä poikkeukset sopivat selittämään tiettyjä virhetilanteita.

  • Tarkistetut poikkeukset: Tarkistettuja poikkeuksia kutsutaan käännösajan poikkeuksiksi, koska kääntäjä tarkistaa nämä poikkeukset käännöshetkellä.
  • Valitsemattomat poikkeukset: Valitsemattomat poikkeukset ovat juuri päinvastaisia ​​kuin tarkistetut poikkeukset. Kääntäjä ei tarkista näitä poikkeuksia käännösvaiheessa. Yksinkertaisesti sanottuna, jos ohjelma heittää tarkistamattoman poikkeuksen, ja vaikka emme käsittelisi tai ilmoittaisi sitä, ohjelma ei antaisi käännösvirhettä.

Huomautus: Tarkastettu vs. valitsematon poikkeus, katso Tarkistetut vs. valitsemattomat poikkeukset

2. Käyttäjän määrittämät poikkeukset:

Joskus Java-sovelluksen sisäänrakennetut poikkeukset eivät pysty kuvaamaan tiettyä tilannetta. Tällaisissa tapauksissa käyttäjät voivat myös luoda poikkeuksia, joita kutsutaan 'käyttäjän määrittämiksi poikkeuksiksi'.

The Poikkeuskäsittelyn edut Javassa ovat seuraavat:

  1. Säännös ohjelman loppuunsaattamiseksi
  2. Ohjelmakoodin ja virheenkäsittelykoodin helppo tunnistaminen
  3. Virheiden leviäminen
  4. Merkittävä virheilmoitus
  5. Virhetyyppien tunnistaminen

Poikkeustietojen tulostamistavat:

1. printStackTrace()

Tämä menetelmä tulostaa poikkeustiedot muodossa Poikkeuksen nimi: poikkeuksen kuvaus, pinojäljitys.

Esimerkki:

Java




//program to print the exception information using printStackTrace() method> > import> java.io.*;> > class> GFG {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >e.printStackTrace();> >}> >}> }>

>

>

Lähtö

java.lang.ArithmeticException: / by zero at GFG.main(File.java:10)>

2. toString()

ToString()-menetelmä tulostaa poikkeustiedot muodossa Poikkeuksen nimi: poikkeuksen kuvaus.

Esimerkki:

Java




//program to print the exception information using toString() method> > import> java.io.*;> > class> GFG1 {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >System.out.println(e.toString());> >}> >}> }>

>

>

Lähtö

java.lang.ArithmeticException: / by zero>

3. getMessage()

GetMessage()-menetelmä tulostaa vain poikkeuksen kuvauksen.

Esimerkki:

Java




//program to print the exception information using getMessage() method> > import> java.io.*;> > class> GFG1 {> >public> static> void> main (String[] args) {> >int> a=>5>;> >int> b=>0>;> >try>{> >System.out.println(a/b);> >}> >catch>(ArithmeticException e){> >System.out.println(e.getMessage());> >}> >}> }>

>

>

Lähtö

/ by zero>

Kuinka JVM käsittelee poikkeusta?

Oletuspoikkeuskäsittely: Aina menetelmän sisällä, jos poikkeus on tapahtunut, menetelmä luo objektin, joka tunnetaan nimellä Exception Object, ja luovuttaa sen ajonaikaiselle järjestelmälle (JVM). Poikkeusobjekti sisältää poikkeuksen nimen ja kuvauksen sekä sen ohjelman nykyisen tilan, jossa poikkeus on tapahtunut. Poikkeusobjektin luomista ja sen käsittelyä ajonaikaisessa järjestelmässä kutsutaan poikkeuksen heittämiseksi. Siellä saattaa olla luettelo menetelmistä, joita oli kutsuttu päästämään menetelmään, jossa poikkeus tapahtui. Tätä järjestettyä menetelmäluetteloa kutsutaan Kutsupino . Nyt tapahtuu seuraava toimenpide.

  • Ajonaikainen järjestelmä etsii kutsupinosta menetelmän, joka sisältää koodilohkon, joka voi käsitellä tapahtuneen poikkeuksen. Koodin lohkoa kutsutaan an Poikkeuskäsittelijä .
  • Ajonaikainen järjestelmä aloittaa haun menetelmästä, jossa poikkeus tapahtui, ja etenee kutsupinon läpi päinvastaisessa järjestyksessä, jossa menetelmät kutsuttiin.
  • Jos se löytää sopivan käsittelijän, se välittää tapahtuneen poikkeuksen sille. Sopiva käsittelijä tarkoittaa, että heitetyn poikkeusobjektin tyyppi vastaa sen käsittelemän poikkeusobjektin tyyppiä.
  • Jos ajonaikainen järjestelmä etsii kaikkia menetelmiä puhelupinosta eikä ole löytänyt sopivaa käsittelijää, ajonaikainen järjestelmä luovuttaa poikkeusobjektin oletuspoikkeuskäsittelijä , joka on osa ajonaikaista järjestelmää. Tämä käsittelijä tulostaa poikkeustiedot seuraavassa muodossa ja lopettaa ohjelman epänormaalisti .
Exception in thread 'xxx' Name of Exception : Description ... ...... .. // Call Stack>

Katso alla olevaa kaaviota ymmärtääksesi puhelupinon kulun.

Luokkapinon kulku poikkeuksia varten Javassa

Kuva:

Java




// Java Program to Demonstrate How Exception Is Thrown> > // Class> // ThrowsExecp> class> GFG {> > >// Main driver method> >public> static> void> main(String args[])> >{> >// Taking an empty string> >String str =>null>;> >// Getting length of a string> >System.out.println(str.length());> >}> }>

>

>

Lähtö

ohjelman lähtö

Katsotaanpa esimerkkiä, joka havainnollistaa, kuinka ajonaikainen järjestelmä etsii sopivaa poikkeustenkäsittelykoodia puhelupinosta.

Esimerkki:

Java




jos muuten jos muuten jos java

// Java Program to Demonstrate Exception is Thrown> // How the runTime System Searches Call-Stack> // to Find Appropriate Exception Handler> > // Class> // ExceptionThrown> class> GFG {> > >// Method 1> >// It throws the Exception(ArithmeticException).> >// Appropriate Exception handler is not found> >// within this method.> >static> int> divideByZero(>int> a,>int> b)> >{> > >// this statement will cause ArithmeticException> >// (/by zero)> >int> i = a / b;> > >return> i;> >}> > >// The runTime System searches the appropriate> >// Exception handler in method also but couldn't have> >// found. So looking forward on the call stack> >static> int> computeDivision(>int> a,>int> b)> >{> > >int> res =>0>;> > >// Try block to check for exceptions> >try> {> > >res = divideByZero(a, b);> >}> > >// Catch block to handle NumberFormatException> >// exception Doesn't matches with> >// ArithmeticException> >catch> (NumberFormatException ex) {> >// Display message when exception occurs> >System.out.println(> >'NumberFormatException is occurred'>);> >}> >return> res;> >}> > >// Method 2> >// Found appropriate Exception handler.> >// i.e. matching catch block.> >public> static> void> main(String args[])> >{> > >int> a =>1>;> >int> b =>0>;> > >// Try block to check for exceptions> >try> {> >int> i = computeDivision(a, b);> >}> > >// Catch block to handle ArithmeticException> >// exceptions> >catch> (ArithmeticException ex) {> > >// getMessage() will print description> >// of exception(here / by zero)> >System.out.println(ex.getMessage());> >}> >}> }>

>

>

Lähtö

/ by zero>

Kuinka ohjelmoija käsittelee poikkeusta?

Räätälöity poikkeuskäsittely: Java-poikkeusten käsittelyä hallitaan viiden avainsanan avulla: yrittää , ottaa kiinni , heittää , heittoja , ja vihdoinkin . Lyhyesti, tässä on kuinka ne toimivat. Ohjelmakäskyt, joiden uskot voivan aiheuttaa poikkeuksia, sisältyvät try-lohkoon. Jos try-lohkossa tapahtuu poikkeus, se heitetään. Koodisi voi napata tämän poikkeuksen (catch block) ja käsitellä sitä jollain järkevällä tavalla. Java-ajonaikainen järjestelmä heittää automaattisesti järjestelmän luomat poikkeukset. Voit heittää poikkeuksen manuaalisesti käyttämällä avainsanaa heitto. Kaikki menetelmästä poistetut poikkeukset on määriteltävä sellaisiksi heittolausekkeella. Mikä tahansa koodi, joka on ehdottomasti suoritettava try-lohkon päätyttyä, laitetaan lopuksi lohkoon.

Kärki: On mentävä läpi ohjaa virtausta yritä kiinni vihdoin estää paremmin ymmärtämistä.

Try-catch -lausekkeen tarve (mukautettu poikkeuskäsittely)

Harkitse alla olevaa ohjelmaa saadaksesi paremman käsityksen try-catch-lausekkeesta.

Esimerkki:

Java




// Java Program to Demonstrate> // Need of try-catch Clause> > // Class> class> GFG {> > >// Main driver method> >public> static> void> main(String[] args)> >{> >// Taking an array of size 4> >int>[] arr =>new> int>[>4>];> > >// Now this statement will cause an exception> >int> i = arr[>4>];> > >// This statement will never execute> >// as above we caught with an exception> >System.out.println(>'Hi, I want to execute'>);> >}> }>

>

>

Lähtö

ohjelman lähtö

Tulostuksen selitys: Yllä olevassa esimerkissä taulukon koko on määritelty, eli voit käyttää elementtejä vain indeksistä 0–3. Mutta yrität päästä käsiksi indeksin 4 elementteihin (vahingossa), minkä vuoksi se tekee poikkeuksen. Tässä tapauksessa JVM lopettaa ohjelman epänormaalisti . Lause System.out.println(Hei, haluan suorittaa); ei koskaan toteuta. Sen suorittamiseksi meidän on käsiteltävä poikkeus käyttämällä try-catchia. Siksi tarvitsemme try-catch-lauseen jatkaaksemme ohjelman normaalia kulkua.

Kuinka käyttää Try-catch -lausetta?

try {  // block of code to monitor for errors  // the code you think can raise an exception } catch (ExceptionType1 exOb) {  // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) {  // exception handler for ExceptionType2 } // optional finally { // block of code to be executed after try block ends  }>

On muistettava tietyt avainkohdat, jotka ovat seuraavat:

  • Metodissa voi olla useampi kuin yksi lause, joka saattaa aiheuttaa poikkeuksen, joten laita kaikki nämä lauseet omiin käsiin yrittää estämään ja tarjoamaan erillisen poikkeuskäsittelijän omassa ottaa kiinni lohko jokaiselle niistä.
  • Jos sisällä tapahtuu poikkeus yrittää lohkon, poikkeuksen käsittelee siihen liittyvä poikkeuskäsittelijä. Poikkeuskäsittelijän yhdistämiseksi meidän on asetettava a ottaa kiinni estää sen jälkeen. Poikkeuskäsittelijöitä voi olla useampi kuin yksi. Jokainen ottaa kiinni block on poikkeuskäsittelijä, joka käsittelee poikkeuksen argumenttinsa osoittamaan tyyppiin. Argumentti ExceptionType ilmoittaa poikkeuksen tyypin, jota se voi käsitellä, ja sen on oltava sen luokan nimi, joka perii Heitettävä luokkaa.
  • Jokaisessa try-lohkossa voi olla nolla tai useampi kiinnityslohko, mutta Vain yksi viimeinen lohko.
  • Lopullinen lohko on valinnainen. Se suoritetaan aina riippumatta siitä, tapahtuiko try-lohkossa poikkeus vai ei. Jos poikkeus tapahtuu, se suoritetaan sen jälkeen yrittää napata lohkoja. Ja jos poikkeusta ei tapahdu, se suoritetaan sen jälkeen yrittää lohko. Javan viimeistä lohkoa käytetään tärkeitä koodeja, kuten puhdistuskoodia, esimerkiksi tiedoston sulkemiseen tai yhteyden sulkemiseen.
  • Jos kirjoitamme try-lohkoon System.exit, lohkoa ei lopulta suoriteta.

Yhteenveto on kuvattu alla olevan visuaalisen apuvälineen avulla seuraavasti:

Poikkeukset Javassa

Aiheeseen liittyvät artikkelit:

Aiheeseen liittyvät kurssit

Java-ohjelmointisäätiö – Self Paced Course

Löydä oikea kurssi, jolla voit aloittaa Java-ohjelmointisäätiön oppimisen alan asiantuntijoilta, joilla on vuosien kokemus. Tämä Java-ohjelmointisäätiö – Self Paced Course kattaa perusasiat Java-ohjelmointikieli, tietotyypit, operaattorit ja vuonohjaus, silmukat, merkkijonot , ja paljon enemmän. Ei enää odottelua! Aloita JAVAn oppiminen nyt ja tule täydelliseksi Java-insinööriksi!