1. Uitzonderingen
>
Uiteindelijk dachten programmeurs aan het standaardiseren en automatiseren van foutafhandeling. Dit gebeurde toen uitzonderingen werden uitgevonden. Nu behandelt het uitzonderingsmechanisme 80% van de uitzonderlijke situaties.
Als een geleerde uitzonderingen bedacht, was dat waarschijnlijk het onderwerp van zijn of haar proefschrift. Als een programmeur het heeft bedacht, heeft hij misschien een vriendelijk schouderklopje gekregen van een collega: "Lijkt goed, man."
Wanneer er een fout optreedt in een Java-programma, zoals delen door 0
, gebeuren er enkele wonderlijke dingen:
Stap een
Er wordt een speciaal uitzonderingsobject gemaakt dat informatie bevat over de opgetreden fout.
Alles in Java is een object, en uitzonderingen zijn geen uitzonderingen 🙂 Uitzonderingsobjecten hebben hun eigen klassen en het enige dat ze onderscheidt van gewone klassen is dat ze de Throwable
klasse erven.
Stap twee
Het uitzonderingsobject wordt "gegooid". Misschien kan de formulering hier beter. "Een uitzondering genereren" lijkt meer op het activeren van een brandalarm of het laten klinken van een "DEFCON 1"-waarschuwing.
Wanneer een uitzondering naar de Java-machine wordt gegenereerd, stopt de normale werking van het programma en beginnen "noodprotocollen".
Stap drie
De methode waarin de uitzondering is gegenereerd, wordt onmiddellijk afgesloten. De uitzondering wordt doorgegeven aan de aanroepende methode, die ook onmiddellijk wordt afgesloten. En zo verder in de keten totdat de main
methode wordt afgesloten. Wanneer de main
methode eindigt, doet het programma dat ook.
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
Er doet zich een uitzondering voor op regel 20: deling door 0. De Java-machine maakt onmiddellijk een uitzondering - een ArithmeticException
object - en "gooit" deze naar de methode.
De divide()
methode eindigt onmiddellijk, dus we zien nooit de string: Er is niets ergs gebeurd: 0. Het programma keert terug naar de endTheWorld()
methode en de situatie herhaalt zich: er is een onverwerkte uitzondering in het systeem, wat betekent dat de endTheWorld()
methode ook abnormaal wordt beëindigd. Dan main
eindigt de methode en stopt het programma.
Wat is het doel van deze uitzonderingen? Welnu, u kunt uw eigen code schrijven om bepaalde soorten uitzonderingen op te vangen en uw eigen logica schrijven om uitzonderlijke situaties aan te pakken.
2. Uitzonderingen vangen:try-catch
Java heeft een mechanisme voor het opvangen van uitzonderingen waarmee u deze abnormale beëindiging van methoden kunt stoppen. Het ziet er zo uit:
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
Deze constructie wordt een try-catch
blok genoemd.
Code waar uitzonderingen op kunnen voorkomen, staat tussen accolades, voorafgegaan door het woord try
.
Na de accolades hebben we het catch
sleutelwoord en, tussen haakjes, de declaratie van een uitzonderingsvariabele . Dit wordt gevolgd door accolades die de uit te voeren code omsluiten als zich een uitzondering van het opgegeven type voordoet .
Als er geen uitzonderingen worden gegenereerd tijdens de uitvoering van de " primaire code ", wordt de code in het catch-blok niet uitgevoerd. Als er een uitzondering optreedt, is dat het geval (als het type van de gegenereerde uitzondering hetzelfde is als het type van de variabele tussen haakjes).
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
3. Meerdere catch
blokken
In theorie kunnen allerlei uitzonderingen in een codeblok worden gegooid. Sommige zul je op de ene manier willen behandelen, andere op een andere manier, en weer andere zul je besluiten helemaal niet aan te pakken.
Java-ontwikkelaars besloten je te helpen en lieten je niet één maar vele catch
blokken achter het try
blok schrijven.
try
{
// Code where an exception might occur
}
catch (ExceptionType1 name1)
{
// Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
// Code for handling ExceptionType2
}
catch (ExceptionType3 name3)
{
// Code for handling ExceptionType3
}
Voorbeeld:
Code | Console-uitvoer |
---|---|
|
|
4. Volgorde van catch
blokken
Uitzonderingen die in een try
blok voorkomen, kunnen alleen door een enkel blok worden opgevangen catch
. U kunt geen uitzonderingsafhandelingssituatie hebben waarbij de code van meerdere catch
blokken wordt uitgevoerd.
Maar de volgorde van de blokken is belangrijk.
U kunt een situatie hebben waarin een uitzondering kan worden opgevangen door meerdere blokken. Als dat het geval is, wordt de uitzondering opgevangen door het catch- blok dat het eerst komt (het dichtst bij het try
blok).
Hoe kun je een situatie hebben waarin meerdere catch-blokken dezelfde uitzondering kunnen opvangen?
Alle uitzonderingen behoren tot een enkele overervingshiërarchie — zie het diagram.
Een ArithmeticException
object kan worden toegewezen aan een variabele waarvan het type ArithmeticException
of een van zijn voorouderklassen is: RuntimeException
, Exception
en Throwable
- zie het diagram.
We zullen meer praten over overerving en voorouderklassen in niveau 21.
Deze code zal prima compileren:
Voordelen van overerving: |
---|
|
Je kunt dus een vangen ArithmeticException
met een van de 4 catch
bovenstaande blokken.
Voorbeeld 1:
Code | Console-uitvoer |
---|---|
|
|
In dit voorbeeld ArithmeticException
kan de worden opgevangen door zowel de catch (Exception e)
als catch (ArithmeticException e)
blokken. Het wordt opgevangen door het blok dat zich het dichtst bij het try
blok bevindt - het eerste catch
blok.
catch
Om verrassingen te voorkomen, is het het beste om blokken die bijna elke uitzondering kunnen opvangen aan het einde van de lijst met blokken te plaatsen .catch
Het Throwable
type is over het algemeen in staat om elke mogelijke uitzondering in Java op te vangen . Als je het in het eerste catch
blok plaatst, zal de code niet compileren, omdat de compiler weet dat er onbereikbare codeblokken zijn.
GO TO FULL VERSION