Mis on erind?
Õppevideo antud teemal:
Sissejuhatus
Kui Java programm satub olukorda, mida pole võimalik tavapäraselt käsitleda (nt: toimub nulliga jagamine), annab Java sellest märku erindi (exception) viskamisega.
Erind katkestab programmi tavapärase töövoo. Kui seda ei käsitleta, siis programm peatub ja väljastab veateate, näiteks:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:5)
Erindite mõistmine tähendab arusaamist, mis need on, kust need tulevad ning kuidas nendega õigesti ümber käia.
Throwable hierarhia
Kõik, mida Java-s saab visata (throw) ja kinni püüda (catch), pärineb ühest baasklassist: Throwable.
Klassil Throwable on kaks otsest alamklassi: Error ja Exception.
Throwable
├── Error
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── ...
└── Exception
├── IOException
├── SQLException
├── RuntimeException
│ ├── NullPointerException
│ ├── IllegalArgumentException
│ ├── ArithmeticException
│ └── ...
└── ...
Error
Error klass tähistab tõsiseid probleeme JVM-i endaga.
Samuti tähistab Error olukordi, millest programmil pole võimalik enam taastuda.
Näiteks:
OutOfMemoryErrortähistab, et JVM-il sai mälu otsa.StackOverflowErrortähistab lõputut rekursiooni.
Error-iga tähistatud vigu ei tohiks kinni püüda ega käsitleda koodis.
Need on olukorrad, millest taastumiseks pole võimalik midagi mõistliku korda saata.
Exception
Exception tähistab viga, millest programmil on võimalik taastuda.
Mõningate erinditega olete juba Javas endas kokku puutunud.
Exception klass jaguneb kaheks:
- Checked exceptions, kontrollitud erindid ehk erindid, mida arendaja peab kinni püüdma ja ära lahendama, näiteks
IOExceptionjaSQLException. - Unchecked exceptions, kontrollimata erindid ehk erindid mille puhul ei pea midagi ette võtma. Kõik kontrollimata erindid on
RuntimeExceptionalamklassid ning mõned näited oleksidNullPointerExceptionjaIllegalArgumentException.
Kontrollitud erindid tuleb kompileerimise käigus kas kinni püüda või meetodi signatuuri kaudu edasi delegeerida. Vastasel juhul tekib kompileerimisviga.
Erindi sisu
Iga erind sisaldab endas infot selle kohta, mis valesti läks:
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println(e.getMessage()); // / by zero
e.printStackTrace(); // full call stack
}
getMessage()tagastab lühikirjelduse tekkinud vea kohtaprintStackTrace()väljastab meetodite väljakutsete ahela, mis viis vea tekkeni. Kasulik silumise ajal.
Erindite viskamine
Erindeid ei viska ainult JVM, neid saab ka ise visata, kasutades throw märksõna:
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative: " + age);
}
this.age = age;
}
Kui throw käsk täidetakse, peatub meetod kohe.
Erind liigub kutsepinust (call stack) üles kuni keegi selle kinni püüab.
Erind on Java viis öelda, et midagi läks valesti ja tavapärane täitmine ei saa jätkuda.
Error on mõeldud parandamatute JVM-tasandi probleemide jaoks, Exception aga probleemide jaoks, mida programm saab käsitleda.
Järgmised peatükid käsitlevad erindite tüüpe, nende käsitlemist ja oma erindite loomist.