====== Poikkeukset ====== Poikkeukset ovat ohjelman virhetilanteita, jotka saattavat aiheuttaa koko ohjelman kaatumisen. ===== Poikkeuksen heittäminen ulos ohjelmasta ===== Jos käyttäjältä kysytään jotain, niin public-litanian perään piti laittaa "''throws IOException''". Tämä kertoo tulkille, että ohjelmassa saattaa syntyä poikkeus IOException, jota ei käsitellä ohjelmassa sen enempää. Tulkki ei suostu kääntämään ohjelmaa, mikäli tätä poikkeusta ei huomioida ohjelmaa kirjoitettaessa. Helpoiten se on huomioitu jättämällä se käsittelemättä. ===== Poikkeuksen käsittely ===== Poikkeus voidaan käsitellä kolmella eri komennolla: ''try'', ====== catch ====== ja ''finally''. ''try''-komennolla aloitetaan lohko, jossa on komento, joka voi aiheuttaa poikkeuksen. Mikäli poikkeus tulee, niin suoritetaan ''try''-lohko. ''Finally''-lohko suoritetaan joka tapauksessa. Esimerkiksi ''Integer.parseInt(String)'' voi aiheuttaa poikkeuksen, mikäli merkkijonossa ei olekaan mitään desimaaliluvuksi tulkittavaa. class Poikkeus { public static void main(String args[]) { int syote; syote = Integer.parseInt(args[0]); System.out.println(syote); } } Ohjelma toimii hyvin, kun argumenttina on kokonaisluku. Mutta kun syöte on desimaaliluku 7.6, niin ohjelmassa tulee poikkeus ''NumberFormatException''. {{ java:poikkeus.jpg }} Tämä voidaan käsitellä seuraavasti: class Poikkeus2 { public static void main(String args[]) { int syote; try { syote = Integer.parseInt(args[0]); System.out.println(syote); } catch (NumberFormatException e) { System.out.println("Et antanut argumenttina kokonaislukua!"); } finally {} //eli ei tehdä mitään } } Ohjelma varoittaa nyt desimaaliluvun syöttämisestä. Ohjelmaan jää kuitenkin vielä virhe. Jos käyttäjä ei anna argumenttina lukua, niin ohjelma kaatuu virheilmoitukseen. Korjaaminen jää harjoitustehtäväksi. ''try''-lohkon perään voidaan laittaa useampi ''catch''-lohko! [[java:poikkeukset:tehtavia|Tehtäviä]]