Exceptions Flashcards
is een catch block verplicht?
Ja, met een paar uitzonderingen:
* tenzij een finally is gedefinieerd
* tenzij er een try-with-resources aan vooraf gaat
Compileert onze code wanneer we in een try blockthrow new IOException();
zetten?
Zo ja, wat zijn de voorwaarden?
Het kan. De voorwaarden:
1) Er mag na die regel geen nieuwe code in dat block worden gerund. Niet alleen is die code unreachable, het zorgt ook voor een compilation error
2) Een gepaste Exception moet gevangen worden in het catch block
Mogen we een try - catch block zonder brackets schrijven? (net als een if statement)
nee, brackets in een try - catch/finally zijn altijd verplicht! (in tegenstelling tot if/else statements
Kunnen we meerder catch statements hebben? Wat zijn de voorwaarden?
Dit mag. De voornaamste voorwaarde is de hyrarchie.
Begin met de specifiekste Exception en eindig met de meest generieke.
Wordt een finally block altijd uitgevoerd?
Ja.
De enige uitzondering hierop is wanneer System.exit(0)
wordt uitgevoerd. Dan kapt de applicatie meteen en wordt niets hierna uitgevoerd.
Hoe ziet een multi catch block eruit? Waar moeten we op letten wanneer we dit schrijven?
catch(MyException | OtherException e) { ... }
Let erop dat we de parameter naam maar 1 keer definiëren. catch(MyException m | OtherException e) { ... }
is dus invalide code!
Let er verder op dat de Exceptions die je definieert geen parent / child relatie van elkaar mogen hebben! Ze moeten disjointed zijn.
Wat voor exception wordt gegooid wanneer een method wordt aangetrapt met parameters die niet voldoen aan de verwachte parameters
IllegalArgumentException
Wat voor type argumenten moet ik in mijn try-with-resources hebben?
Dit moeten AutoCloseable
objecten zijn. Bijvoorbeeld een FileInputStream of FileOutputStream. Simpelweg een String of int in een try-with-resources levert compilation errors op.
Kan ik in try-with-resources naar bestaande variabelen refereren?
Een variabele in t-w-r is alleen in local scope beschikbaar en moet dus tussen de haakjes geinstantieerd worden. Een uitzondering hierop is wanneer een bestaande variabele final of effectively final is.
Effectively final betekent dat op geen enkel moment (ook niet na het try block) de variabele gewijzigd mag worden.
Goed:
try (var myFile = new FileReader("dummy.txt")){...
Goed:
final var myFile = new FileReader("dummy.txt"); try (myFile){...
Goed:
var myFile = new FileReader("dummy.txt"); `try (myFile){...
Fout:
FileReader myFile; try (myFile = new FileReader("dummy.txt")){...
Fout:
var myFile = new FileReader("dummy.txt"); try (myFile){...} myFile = new FileReader("other.txt");
Wat betekent AutoCloseable?
Een AutoCloseable kan als parameter in een try-with-resources blok worden gebruikt, en wordt gesloten aan het einde van dat blok. In dat geval hoef je geen .close() method aan te trappen; dit gebeurt automatisch.
Wat is het verschil tussen checked en unchecked exceptions?
Een checked exception gebeurt op compile time. Handel je een method die een checked exception gooit niet goed af dan compileert je code niet.
Een unchecked exception gooit pas een error in runtime en java geeft je de kans om je code te compileren.
checked exceptions moeten afgehandeld worden. Unchecked exceptions mogen afgehandeld worden.
Wat voor soort Exception is de IllegalArgumentException (checked of unchecked)
unchecked (want extent de RuntimeException)
Wat voor soort Exception is de IOException (checked of unchecked)
checked
(moet dus compile time afgehandeld worden)
Wat voor soort Exception is de FileNotFoundException (checked of unchecked)
checked
(moet dus compile time afgehandeld worden)
Noem 4 Runtime Exceptions
ArithmeticException, ArrayIndexOutOfBoundsException, ClassCastException, IllegalArgumentException, IllegalStateException, NullPointerException, NumberFormatException
Wanneer zouden we een ArithmeticException kunnen krijgen?
Als we bijvoorbeeld iets door 0 proberen te delen.
Wat is het verschil tussen een Error en een Exception?
Een Exception kunnen we ‘catchen’. Een Error niet.
Errors komen doorgaans alleen voor wanneer je machine te weinig geheugen heeft. Een infinite loop kan hiervan de oorzaak zijn. Op dat moment is er niets wat je programma kan doen; het crasht simpelweg.
Wanneer gebruiken we throw en throws in exception handling?
Throws gebruiken we in de method signature.
Throw gebruiken we in een method of een try/catch block.
Stel, we hebben een class:
class Parent { void doThing() throws IOException { ... } }
mogen we in een child class van Parent de doThing method als volgt overriden?void doThing() throws Exception
Nee.
De overriden Exception dient net zo specifiek of specifieker te zijn dan zijn parent.
Stel, we hebben een class:
class Parent { void doThing() throws IOException { ... } }
mogen we in een child class van Parent de doThing method als volgt overriden?void doThing() throws RuntimeException
Nee.
De overriden Exception dient net zo specifiek of specifieker te zijn dan zijn parent, en ze dienen dus gerelateerd te zijn aan elkaar. IOException en RuntimeException hebben geen relatie tot elkaar.
Hoe herkennen we een checked exception
Aan het sleutelwoord throws. Een method signature kan bijvoorbeeld throws IOException
bevatten. Dit betekent dat wanneer die method wordt afgevuurd, dat er ergens een throw new IOException();
moet staan.
Compileert de volgende code? waarom wel / niet?
public void myMethod() { try { eatCarrot(); } catch (NoMoreCarrotsException e) { System.out.print("sad rabbit"); } } private void eatCarrot() {}
Dit compileert niet. Het probleem is dat we iets proberen te catchen, terwijl eatCarrot geen throws bevat. Daarom is dit unreachable code en compileert het niet.
Noem de 3 manieren om een Exception te printen.
- Simpelweg het exception object zelf
printjava.lang.RuntimeException: {{ message }}
-
e.getMessage();
print{{ message }}
-
e.printStackTrace();
print
~~~
java.lang.RuntimeException: {{ message }}
at MyClass.method(MyClass.java:15)
at MyClass.main(MyClass.java:7)
~~~
Wanneer krijgen we een ArithmeticException
?
Wanneer we iets door 0 proberen te delen bijvoorbeeld