Vanlige Java-unntak

1. Introduksjon

Denne opplæringen fokuserer på noen vanlige Java-unntak.

Vi begynner med å diskutere hva et unntak i utgangspunktet er. Senere vil vi diskutere forskjellige typer avmerkede og ukontrollerte unntak i detalj.

2. Unntak

Et unntak er en unormal tilstand som oppstår i en kodesekvens under gjennomføringen av et program. Denne unormale tilstanden oppstår når et program bryter visse begrensninger ved kjøretid.

Alle unntakstyper er underklasser av klassen Unntak. Denne klassen deles deretter inn i avmerkede unntak og ukontrollerte unntak. Vi vil vurdere dem i detalj i de påfølgende delene.

3. Avmerkede unntak

Sjekket unntak er obligatorisk å håndtere. De er direkte underklasser i klassen Unntak.

Det er en debatt om deres betydning som er verdt å ta en titt.

La oss definere noen avmerkede unntak i detalj.

3.1. IO Unntak

En metode kaster en IO Unntak eller en direkte underklasse av den når inngang / utgang mislykkes.

Typiske bruksområder for disse I / O-operasjonene inkluderer:

  • Arbeide med filsystemet eller datastrømmene ved hjelp av java.io pakke
  • Opprette nettverksapplikasjoner ved hjelp av java.net pakke

FileNotFoundException

FileNotFoundException er en vanlig type IO Unntak mens du arbeider med filsystemet:

prøv {ny FileReader (ny fil ("/ ugyldig / fil / plassering")); } fange (FileNotFoundException e) {LOGGER.info ("FileNotFoundException fanget!"); }

MisdannetURLE unntak

Når vi jobber med nettadresser, kan vi støte på MisdannetURLE unntak - hvis nettadressene våre er ugyldige.

prøv {new URL ("malformedurl"); } fangst (MalformedURLException e) {LOGGER.error ("MalformedURLException fanget!"); }

3.2. ParseException

Java bruker tekstparsering for å lage et objekt basert på et gitt String.Hvis parsing forårsaker en feil, kaster den a ParseException.

For eksempel kan vi representere Dato på forskjellige måter f.eks. dd / mm / åååå eller dd, mm, åååå, men prøv å analysere a streng med et annet format:

prøv {new SimpleDateFormat ("MM, dd, åååå"). parse ("ugyldig dato"); } fange (ParseException e) {LOGGER.error ("ParseException fanget!"); }

Her, den String er misdannet og forårsaker a ParseException.

3.3. InterruptedException

Når en Java-tråd ringer bli med (), sove () eller vente() det går inn i enten VENTER staten eller TIMED_WAITING stat.

I tillegg kan en tråd avbryte en annen tråd ved å ringe en annen tråd avbryte() metode.

Følgelig de tråden kaster en InterruptedException hvis en annen tråd avbryter den mens den er i VENTER eller i TIMED_WAITING stat.

Tenk på følgende eksempel med to tråder:

  • Hovedtråden starter barnetråden og avbryter den
  • Barnetråden starter og ringer søvn()

Dette scenariet resulterer i et InterruptedException:

class ChildThread utvider tråd {public void run () {try {Thread.sleep (1000); } fange (InterruptedException e) {LOGGER.error ("InterruptedException fanget!"); }}} offentlig klasse MainThread {public static void main (String [] args) kaster InterruptedException {ChildThread childThread = new ChildThread (); childThread.start (); childThread.interrupt (); }}

4. Uavmerkede unntak

For unchecked Unntak sjekker ikke kompilatoren under kompileringsprosessen. Derfor er det ikke obligatorisk for metoden å håndtere disse unntakene.

Alle ukontrollerte unntak utvider klassen RuntimeException.

La oss diskutere noen ukontrollerte unntak i detalj.

4.1. NullPointerException

Hvis et program prøver å bruke null der det faktisk krever en objektforekomst, vil metoden kaste a NullPointerException.

Det er forskjellige scenarier der ulovlig bruk av null årsaker NullPointerException. La oss vurdere noen av dem.

Kaller en metode i klassen som ikke har en objektforekomst:

Streng strObj = null; strObj.equals ("Hello World"); // kaster NullPointerException.

Også hvis et program prøver å få tilgang til eller endre en forekomstvariabel med en null referanse, vi får en NullPointerException:

Person personObj = null; Strengnavn = personObj.personnavn; // Tilgang til feltet til et nullobjekt personObj.personName = "Jon Doe"; // Endring av feltet til et null-objekt

4.2. ArrayIndexOutOfBoundsException

En matrise lagrer elementene sammenhengende. Dermed kan vi få tilgang til elementene via indekser.

derimot, hvis et stykke kode prøver å få tilgang til en ulovlig indeks for en matrise, kaster den respektive metoden en ArrayIndexOutOfBoundException.

La oss se noen eksempler som kaster ArrayIndexOutOfBoundException:

int [] nums = new int [] {1, 2, 3}; int numFromNegativeIndex = nums [-1]; // Prøver å få tilgang til negativ indeks int numFromGreaterIndex = nums [4]; // Prøver å få tilgang til større indeks int numFromLengthIndex = nums [3]; // Prøver å få tilgang til indeks lik størrelsen på matrisen

4.3. StringIndexOutOfBoundsException

De String klasse i Java gir metodene for å få tilgang til et bestemt tegn i strengen eller for å skjære ut et tegnrute ut av String. Når vi bruker disse metodene, konverterer den internt String inn i en karakteroppstilling.

Igjen, det kan være ulovlig bruk av indekser på denne matrisen. I slike tilfeller er disse metodene for String klassen kaster StringIndexOutOfBoundsException.

Dette unntaket indikerer at indeksen enten er større enn eller lik størrelsen på String.StringIndexOutOfBoundsException strekker IndexOutOfBoundsException.

Metoden charAt (indeks) av klassen String kaster dette unntaket når vi prøver å få tilgang til et tegn i indeksen lik String's lengde eller annen ulovlig indeks:

String str = "Hello World"; char charAtNegativeIndex = str.charAt (-1); // Prøver å få tilgang til negativ indeks char charAtLengthIndex = str.charAt (11); // Prøver å få tilgang til indeks lik størrelse på strengen 

4.4. NumberFormatException

Ofte ender en applikasjon opp med numeriske data i en String. For å tolke disse dataene som numeriske, tillater Java konvertering av String til numeriske typer. Innpakningsklassene som Heltall, flyte osv. inneholder verktøymetoder for dette formålet.

Derimot, hvis String ikke har et passende format under konverteringen, kaster metoden a NumberFormatException.

La oss vurdere følgende utdrag.

Her erklærer vi a String med alfanumeriske data. Videre prøver vi å bruke metodene til Heltall wrapper klasse for å tolke disse dataene som numeriske.

Følgelig resulterer dette i NumberFormatException:

Streng str = "100ABCD"; int x = Integer.parseInt (str); // kaster NumberFormatException int y = Integer.valueOf (str); // Kaster NumberFormatException

4.5. Aritmetisk unntak

Når et program evaluerer en aritmetisk operasjon og det resulterer i enestående tilstand, kaster det Aritmetisk unntak. I tillegg, Aritmetisk unntak gjelder bare int og lang datatyper.

For eksempel, hvis vi prøver å dele et heltall med null, får vi et Aritmetisk unntak:

int illegalOperasjon = 30/0; // Kaster ArithmeticException

4.6. ClassCastException

Java tillater typecasting mellom objektene for å støtte arv og polymorfisme. Vi kan enten kaste et objekt opp eller kaste det ned.

I upcasting kaster vi et objekt til supertypen. Og i nedkastning kaster vi et objekt til en av dens undertyper.

Derimot, ved kjøring, hvis koden prøver å nedstøpe et objekt til en undertype som det ikke er en forekomst av, kaster metoden en ClassCastException.

Kjøretidsforekomsten er det som faktisk betyr noe i typecasting. Tenk på følgende arv mellom Dyr, Hund og løve:

klasse Animal {} klasse Dog utvider Animal {} klasse Lion utvider Animal {} 

Videre, i førerklassen, kastet vi Dyr referanse som inneholder en forekomst av Løve inn i en Hund.

Imidlertid legger JVM merke til den forekomsten på kjøretiden Løve er ikke kompatibel med undertypen i klassen Hund.

Dette resulterer i ClassCastException:

Dyredyr = ny løve (); // Ved kjøretid er forekomsten Lion Dog tommy = (Dog) animal; // kaster ClassCastException

4.7. IllegalArgumentException

En metode kaster en IllegalArgumentException hvis vi kaller det med noen ulovlige eller upassende argumenter.

For eksempel søvn() metoden for Tråd klasse forventer positiv tid og vi passerer et negativt tidsintervall som argument. Dette resulterer i IllegalArgumentException:

Thread.currentThread (). Sleep (-10000); // Kaster IllegalArgumentException

4.8. IllegalStateException

IllegalStateException signaliserer at en metode er påkalt på et ulovlig eller upassende tidspunkt.

Hvert Java-objekt har en tilstand (forekomstvariabler) og noe oppførsel (metoder). Og dermed, IllegalStateException betyr at det er ulovlig å påkalle atferden til dette objektet med gjeldende tilstandsvariabler.

Imidlertid, med noen forskjellige tilstandsvariabler, kan det være lovlig.

For eksempel bruker vi en iterator for å gjenta en liste. Hver gang vi initialiserer en, setter den internt sin statusvariabel lastRet til -1.

Med denne sammenhengen prøver programmet å kalle fjerne metode på listen:

// Initialisert med indeks ved -1 Iterator intListIterator = ny ArrayList (). Iterator (); intListIterator.remove (); // IllegalStateException 

Internt, den fjerne metoden sjekker tilstandsvariabelen lastRet og hvis det er mindre enn 0, kaster det IllegalStateException. Her peker variabelen fremdeles på verdien -1.

Som et resultat får vi en IllegalStateException.

5. Konklusjon

I denne artikkelen diskuterte vi først hva som er unntak. An unntak er en hendelse som oppstår under gjennomføringen av et program som forstyrrer den normale strømmen av programmets instruksjoner.

Deretter kategoriserte vi unntakene i de avmerkede unntakene og de ukontrollerte unntakene.

Deretter diskuterte vi forskjellige typer unntak som kan komme opp i løpet av kompileringstiden eller i løpetiden.

Vi kan finne koden for denne artikkelen på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found