Almindelige Java-undtagelser

1. Introduktion

Denne tutorial fokuserer på nogle almindelige Java-undtagelser.

Vi begynder med at diskutere, hvad en grundlæggende undtagelse er. Senere vil vi diskutere forskellige typer af kontrollerede og ukontrollerede undtagelser i detaljer.

2. Undtagelser

En undtagelse er en unormal tilstand, der opstår i en kodesekvens under udførelsen af ​​et program. Denne unormale tilstand opstår, når et program overtræder visse begrænsninger ved kørsel.

Alle undtagelsestyper er underklasser af klassen Undtagelse. Denne klasse deles derefter i kontrollerede undtagelser og ikke-markerede undtagelser. Vi overvejer dem detaljeret i de efterfølgende afsnit.

3. Kontrollerede undtagelser

Kontrollerede undtagelser er obligatoriske at håndtere. De er direkte underklasser af klassen Undtagelse.

Der er en debat om deres betydning, der er værd at tage et kig på.

Lad os definere nogle kontrollerede undtagelser i detaljer.

3.1. IOUndtagelse

En metode kaster en IOUndtagelse eller en direkte underklasse af den, når enhver input / output-handling mislykkes.

Typiske anvendelser af disse I / O-operationer inkluderer:

  • Arbejde med filsystemet eller datastrømme ved hjælp af java.io pakke
  • Oprettelse af netværksapplikationer ved hjælp af java.net pakke

FileNotFoundException

FileNotFoundException er en almindelig type IOUndtagelse mens du arbejder med filsystemet:

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

MisdannetURLE undtagelse

Når vi arbejder med webadresser, kan vi støde på MisdannetURLE undtagelse - hvis vores webadresser er ugyldige.

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

3.2. ParseException

Java bruger tekstparsing til at oprette et objekt baseret på et givet Snor.Hvis parsing forårsager en fejl, kaster den en ParseException.

For eksempel kunne vi repræsentere Dato på forskellige måder f.eks. dd / mm / åååå eller dd, mm, åååå, men prøv at analysere a snor med et andet format:

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

Her, den Snor er misdannet og forårsager a ParseException.

3.3. Afbrudt undtagelse

Hver gang en Java-tråd ringer join (), sleep () eller vente() det går i enten VENTER stat eller TIMED_WAITING stat.

Derudover kan en tråd afbryde en anden tråd ved at ringe til en anden tråd afbryde() metode.

Følgelig, det tråden kaster en Afbrudt undtagelse hvis en anden tråd afbryder den, mens den er i VENTER eller i TIMED_WAITING stat.

Overvej følgende eksempel med to tråde:

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

Dette scenarie resulterer i en InterruptedException:

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

4. Ikke-markerede undtagelser

For ikke-markerede undtagelser kontrollerer compileren ikke under kompileringsprocessen. Derfor er det ikke obligatorisk for metoden at håndtere disse undtagelser.

Alle ukontrollerede undtagelser udvider klassen RuntimeException.

Lad os diskutere nogle ukontrollerede undtagelser i detaljer.

4.1. NullPointerException

Hvis et program forsøger at bruge nul hvor det faktisk kræver en objektinstans, kaster metoden a NullPointerException.

Der er forskellige scenarier, hvor ulovlig anvendelse af nul årsager NullPointerException. Lad os overveje nogle af dem.

Opkald til en metode i klassen, der ikke har nogen objektforekomst:

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

Også, hvis et program forsøger at få adgang til eller ændre en instansvariabel med en nul reference, vi får en NullPointerException:

Person personObj = null; String name = personObj.personName; // Adgang til feltet for et null-objekt personObj.personName = "Jon Doe"; // Ændring af feltet for et null-objekt

4.2. ArrayIndexOutOfBoundsException

En matrix gemmer sine elementer sammenhængende. Således kan vi få adgang til dets elementer via indekser.

Imidlertid, hvis et stykke kode forsøger at få adgang til et ulovligt indeks for en matrix, kaster den respektive metode en ArrayIndexOutOfBoundException.

Lad os se et par eksempler, der kaster ArrayIndexOutOfBoundException:

int [] nums = ny int [] {1, 2, 3}; int numFromNegativeIndex = nums [-1]; // Forsøger at få adgang til negativt indeks int numFromGreaterIndex = nums [4]; // Forsøger at få adgang til større indeks int numFromLengthIndex = nums [3]; // Forsøger at få adgang til et indeks svarende til arrayets størrelse

4.3. StringIndexOutOfBoundsException

Det Snor klasse i Java giver metoderne til at få adgang til et bestemt tegn i strengen eller til at skære et tegnarray ud af Snor. Når vi bruger disse metoder, konverterer den internt Snor ind i et tegnarray.

Igen kan der være ulovlig brug af indekser på denne matrix. I sådanne tilfælde er disse metoder til Snor klasse kaster StringIndexOutOfBoundsException.

Denne undtagelse angiver, at indekset enten er større end eller lig med størrelsen på Snor.StringIndexOutOfBoundsException strækker sig IndexOutOfBoundsException.

Metoden charAt (indeks) af klassen Snor kaster denne undtagelse, når vi prøver at få adgang til et tegn i indekset lig med String's længde eller andet ulovligt indeks:

String str = "Hello World"; char charAtNegativeIndex = str.charAt (-1); // Forsøger at få adgang til negativ indeks char charAtLengthIndex = str.charAt (11); // Forsøger at få adgang til indeks svarende til strengens størrelse 

4.4. NumberFormatException

Ofte ender en applikation med numeriske data i en Snor. For at fortolke disse data som numeriske tillader Java konvertering af Snor til numeriske typer. Indpakningsklasser såsom Heltal, flyde osv. indeholder værktøjsmetoder til dette formål.

Imidlertid, hvis den Snor ikke har et passende format under konverteringen, kaster metoden a NumberFormatException.

Lad os overveje følgende uddrag.

Her erklærer vi en Snor med alfanumeriske data. Yderligere forsøger vi at bruge metoderne til Heltal indpakningsklasse for at fortolke disse data som numeriske.

Derfor resulterer dette i NumberFormatException:

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

4.5. Aritmetisk undtagelse

Når et program vurderer en aritmetisk operation, og det resulterer i en eller anden usædvanlig tilstand, kaster det Aritmetisk undtagelse. Ud over, Aritmetisk undtagelse gælder kun int og lang datatyper.

For eksempel, hvis vi prøver at dele et heltal med nul, får vi et Aritmetisk undtagelse:

int illegal drift = 30/0; // Kaster aritmetisk undtagelse

4.6. ClassCastException

Java tillader typecasting mellem objekterne for at understøtte arv og polymorfisme. Vi kan enten opkast et objekt eller nedsky det.

I upcasting kaster vi et objekt til dets supertype. Og i downcasting kaster vi et objekt til en af ​​dets undertyper.

Imidlertid, ved kørsel, hvis koden forsøger at downcast et objekt til en undertype, som det ikke er en forekomst af, kaster metoden en ClassCastException.

Runtime-forekomsten er, hvad der faktisk betyder noget i typecasting. Overvej følgende arv mellem Dyr, Hund og løve:

klasse Animal {} klasse Dog udvider Animal {} klasse Lion udvider Animal {} 

Desuden støtter vi i førerklassen Dyr reference, der indeholder en forekomst af Løve ind i en Hund.

Imidlertid bemærker JVM ved kørselstidspunktet den forekomst Løve er ikke kompatibel med undertypen af ​​klassen Hund.

Dette resulterer i ClassCastException:

Dyredyr = ny løve (); // Ved runtime er forekomsten Lion Dog tommy = (Hund) dyr; // kaster ClassCastException

4.7. IllegalArgumentException

En metode kaster en IllegalArgumentException hvis vi kalder det med nogle ulovlige eller upassende argumenter.

For eksempel søvn() metode til Tråd klasse forventer positiv tid, og vi passerer et negativt tidsinterval som et argument. Dette resulterer i IllegalArgumentException:

Tråd.strømTråd (). Søvn (-10000); // Kaster IllegalArgumentException

4.8. IllegalStateException

IllegalStateException signalerer, at en metode er påberåbt på et ulovligt eller upassende tidspunkt.

Hvert Java-objekt har en tilstand (instansvariabler) og en vis adfærd (metoder). Dermed, IllegalStateException betyder, at det er ulovligt at påberåbe sig dette objekts opførsel med de aktuelle tilstandsvariabler.

Men med nogle forskellige tilstandsvariabler kan det være lovligt.

For eksempel bruger vi en iterator til at gentage en liste. Når vi initialiserer en, indstiller den internt sin tilstandsvariabel lastRet til -1.

I denne sammenhæng forsøger programmet at kalde fjerne metode på listen:

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

Internt er den fjerne metode kontrollerer tilstandsvariablen lastRet og hvis det er mindre end 0, kaster det IllegalStateException. Her peger variablen stadig på værdien -1.

Som et resultat får vi en IllegalStateException.

5. Konklusion

I denne artikel diskuterede vi først, hvad der er undtagelser. En undtagelse er en begivenhed, der opstår under udførelsen af ​​et program, der forstyrrer den normale strøm af programmets instruktioner.

Derefter kategoriserede vi undtagelserne i de kontrollerede undtagelser og de ikke-markerede undtagelser.

Dernæst diskuterede vi forskellige typer undtagelser, der kan komme op under kompileringstiden eller i løbetiden.

Vi kan finde koden til denne artikel på GitHub.