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
Wanneer krijgen we een ArrayIndexOutOfBoundsException
?
Wanneer we een index van een array willen benaderen die niet bestaat.
Wanneer krijgen we een ClassCastException
?
Wanneer we een variabele naar een type casten wat niet bestaat.
bijvoorbeeld:
~~~
String type = “moose”;
Integer number = (Integer) type;
~~~
Wanneer krijgen we een NullPointerException
?
Wanneer een object null als waarde heeft, en we voeren een method uit op dit object.
Wanneer krijgen we een IllegalArgumentException
?
Wanneer we een parameter value (argument) mee proberen te geven die niet overeen komt met de waarde die wordt verwacht. Voorbeeld:
public void setNumberEggs(int numberEggs) { if (numberEggs < 0) throw new IllegalArgumentException("# eggs must not be negative"); this.numberEggs = numberEggs; }
Wanneer krijgen we een NumberFormatException
?
NumberFormatException is vergelijkbaar met IllegalArgumentException. Alleen specifiek voor nummers. Hij wordt gegooid wanneer een parseInt bijvoorbeeld een String meekrijgt:Integer.parseInt("abc");
Noem de vijf Checked Exception classes die we voor het examen moeten weten
- IOException
- FileNotFoundException (subclass van IOException)
- NotSerializableException (subclass van IOException)
- ParseException
- SQLException
Betekent een ‘gethrowde’ exception dat het runnen van je java applicatie stopt?
Niet persé. Een gethrowde exception kan met een try/catch afgevangen worden. Dan kun je gedrag definiëren en vanaf daar verder gaan.
Beschouw deze code. Wat returnt het?
~~~
int fooMethod() {
try {
return 1
} finally {
return 2
}
}
~~~
return value is 2
. Onthoud dat finally altijd als laatste runt; en ook iets returnt voordat het try block dit kan doen.
Hoe ziet de syntax voor meerdere try-with-resources eruit?
try ( var in = new FileInputStream("in.txt"); var out = new FileOutputStream("out.txt") )
- variables worden gescheiden met
;
. (niet,
dus) - na de laatste variable is de
;
optioneel
Stel, we hebben deze code:
~~~
try (
var in = new MyFileClass(1);
var out = new MyFileClass(2)
) { }
~~~
de close in MyFileClass logt de parameters die mee worden gegeven (dus 1 en 2). In welke volgorde geubeurt dit?
Omgekeerd. Eerst wordt 2 gelogd en dan 1. Denk eraan dat de close()
method van alle autoCloseables in een try block in reverse order worden afgetrapt
Leg kort uit hoe de DecimalFormat API werkt.
* Wat is / zijn de mogelijke input(s)?
* Hoe formatten we de nummers?
- Wanneer we
var myDf = new DecimalFormat(...)
zeggen verwachten we een String als input. - In die String kan bijvoorbeeld dit geplaatst worden:
$#,###,###.00
. - Elke
#
betekent dat het wordt vervangen door het getal, of niets als er geen waarde voor is. - Elke
0
betekent dat het wordt vervangen door het getal, of 0 als er geen waarde voor is. -
myDf.format(1234)
print zo$1,124.00
uit.
Stel, we hebben een localdate object.
* hoe krijgen we de uitgeschreven dag?
* hoe krijgen we de uitgeschreven maand?
* hoe krijgen we het jaar?
* hoe krijgen we de dag van het jaar terug?
- .getDayOfWeek() // THURSDAY
- .getMonth() // OCTOBER
- .getYear() // 2024
- .getDayOfYear() // 293
Waarom compileert deze code niet?
~~~
LocalDate date = LocalDate.of(2022, Month.OCTOBER, 20);
date.format(DateTimeFormatter.ISO_LOCAL_TIME)
~~~
date.format verwacht een date object, geen time object
Waarom compileert dit niet?
~~~
LocalTime time = LocalTime.of(11, 12, 34);
time.format(DateTimeFormatter.ISO_LOCAL_DATE);
~~~
time.format verwacht een time object, geen date object
Hoe maken we een eigen format voor een datum / tijd?
met DateTimeFormatter.ofPattern. Bijvoorbeeld:
~~~
LocalDateTime dt = LocalDateTime.of(date, time);
var f = DateTimeFormatter.ofPattern(“MMMM dd, yyyy ‘at’ hh:mm”);
System.out.println(dt.format(f));
~~~
Noem de symbolen om een datetime te formatten, en in welke api’s zijn ze beschikbaar?:
* jaar
* maand
* dag
* uur
* minuut
* seconde
* am/pm
* tijdzone naam
* tijdzone afwijking
- jaar:
y
(LocalDate, LocalDateTime en ZonedDateTime) - maand:
M
(LocalDate, LocalDateTime en ZonedDateTime) - dag:
d
(LocalDate, LocalDateTime en ZonedDateTime) - uur:
h
(LocalTime, LocalDateTime en ZonedDateTime) - minuut:
m
(LocalTime, LocalDateTime en ZonedDateTime) - seconde:
S
(LocalTime, LocalDateTime en ZonedDateTime) - am/pm:
a
(LocalTime, LocalDateTime en ZonedDateTime) - tijdzone naam:
z
(alleen in ZonedDateTime) - tijdzone afwijking:
Z
(alleen in ZonedDateTime)
Kan ik in DateTimeFormatter.ofPattern
ook mijn eigen tekst opgeven?
Ja, mits het met single quotes is weergegeven:DateTimeFormatter.ofPattern("'Het is ' hh:mm");
Mocht je een quote in je pattern hebben, gebruik dan een dubbele quote:DateTimeFormatter.ofPattern("'Het is ' hh:mm 'uur ''s nachts'");
Compileert dit?
~~~
DateTimeFormatter.ofPattern(“‘Time is: hh:mm: “);
~~~
Nee. Een single quote wordt niet gesloten.
Compileert dit?
~~~
DateTimeFormatter.ofPattern(“The time is hh:mm”);
~~~
Nee, custom tekst moet tussen single quotes komen te staan.
Hoe verkrijgen we de locale van de huidige machine?
Locale.getDefault();
dit geeft in ons geval nl_NL terug
Wat zijn de regels voor een valide Locale string?
- patroon is
language_LAND
. Bijvoorbeelden_US
. - language moet lowercase zijn
- land moet uppercase zijn
- language is verplicht
- land is optioneel
- Als het land is ingevuld, moeten de 2 gescheiden zijn door een underscore
Wat zijn de drie manieren om een locale object met een fixed land en/of taal mee te geven?
Locale locale1 = Locale.GERMANY; Locale locale2 = new Locale("de", "DE"); Locale locale3 = new Locale.Builder() .setLanguage("de") .setRegion("DE") .build();
Hoe stellen we een nieuwe default locale in?
Locale.setDefault(new Locale("fr"));
Stel, ik heb een int:int myInt = 1000000;
Hoe print ik dit in het format van een Locale naar wens uit?
var us = NumberFormat.getInstance(Locale.US); System.out.println(us.format(myInt)); // 1,000,000
of
~~~
var de = NumberFormat.getInstance(Locale.GERMAN);
System.out.println(de.format(myInt)); // 1.000.000
~~~
Hoe converteer ik een int naar de juiste currency van een Locale die ik definieer?
met .getCurrencyInstance()
.
bijvoorbeeld:
~~~
double myInt = 1000000.15;
System.out.println(NumberFormat
.getCurrencyInstance(Locale.US)
.format(myInt));
System.out.println(NumberFormat
.getCurrencyInstance(Locale.GERMANY)
.format(myInt));
~~~
Hoe converteer ik een int naar de juiste procent weergave van een Locale die ik definieer?
met .getPercentInstance()
.
bijvoorbeeld:
~~~
double myInt = 0.15;
System.out.println(NumberFormat
.getPercentInstance(Locale.US)
.format(myInt));
System.out.println(NumberFormat
.getPercentInstance(Locale.GERMANY)
.format(myInt));
~~~
Hoe maak ik van deze int:int myNumber = 7_323_800
een uitgeschreven nummer?
met getCompactNumberInstance()
.
Bijv:
~~~
NumberFormat
.getCompactNumberInstance(
Locale.getDefault(),
Style.SHORT)
.format(myNumber); // 7M
~~~
Short hoeft niet gedefinieerd te worden. Style.SHORT is de default waarde. We kunnen million ook uitschrijven:
~~~
NumberFormat
.getCompactNumberInstance(
Locale.getDefault(),
Style.LONG)
.format(myNumber); // 7 million
~~~
Wat voor verschillende eenheden worden met getCompactNumberInstance
uitgeschreven? En wat is de korte en lange equivalent?
- duizenden:
thousand
(lang) enK
(kort) - miljoenen:
milion
(lang) enM
(kort) - biljoenen:
billion
(lang) enB
(kort) - triljoenen:
trillion
(lang) enT
(kort)
Wat is een resource bundle? Hoe moeten we een resource bundle noemen en hoe halen we deze op?
Een resource bundle is geschikt voor vertaal bestanden. Het bestand kunnen we bijvoorbeeld zo noemen: App_en.properties
. En kan deze regel hebben:hw=Hello World
In onze class maken we een resource bundle aan:var rb = ResourceBundle.getBundle("App", locale);
en van deze bundle kunnen we vervolgens hw printen:System.out.println(rb.getString("hw");
Hoe itereren we over alle strings van een resource bundle?
Bijvoorbeeld als volgt:
~~~
ResourceBundle rb = ResourceBundle
.getBundle(“App”, locale);
rb.keySet().stream()
.map(k -> k + “: “ + rb.getString(k))
.forEach(System.out::println);
~~~
Compileert dit? Zo nee wat is er mis mee?
~~~
LocalDate date = LocalDate.parse(
“2022-04-30”,
DateTimeFormatter.ISO_LOCAL_DATE_TIME);
~~~
Dit compileert niet omdat ISO_LOCAL_DATE_TIME niet meegegeven kan worden aan een LocalDate object.
Hoe ziet een goede locale builder syntax eruit?
new Locale.Builder() .setLanguage("nl") .setRegion("NL").build();
- setLanguage is verplicht
- setRegion is optioneel
-
.build
is vereist!
public static int doIt() throws Exception { throw new Exception("aaa"); }
compileert dit?
Ja. Hoewel de method een int returnt, hoeft het deze int niet te returnen als het in plaats daarvan een exception goed afhandelt.