Laadi ohjelma, jossa yksi metodi heittää poikkeuksen, jonka toinen
metodi sieppaa. Selitä yksityiskohtaisesti, mitä tapahtuu, kun
poikkeus heitetään ja kun se siepataan.
Selitä myös seuraavat poikkeusten käsittelyyn liittyvät kysymykset:
Miksi poikkeusten heittäminen soveltuu erityisen hyvin kirjastoluokissa
havaittujen virheiden käsittelyyn?
Miksi poikkeuksia ei pitäisi käyttää ohjelman normaalin kontrollin
kulun ohjaamiseen?
Mitä tapahtuu, jos tulee poikkeus eikä sopivaa poikkeuskäsittelijää
ole ohjelmoitu?
Mihin finally-lohkot on tarkoitettu? Mitä tapahtuu, jos finally-lohko
itse heittää poikkeuksen?
Selitä luokkien Throwable, Error, Exception ja RuntimeException
luokkahierarkia. Mihin nämä eri luokat on tarkoitettu?
Selitä tarkistettujen (checked) ja tarkistamattomien (unchecked)
poikkeusten ero ohjelmoinnissa.
Miten ne sijoittuvat poikkeusten luokkahierarkiaan.
Milloin on syytä heittää tarkistettu, milloin tarkistamaton poikkeus?
Miksi?
Minkä poikkeusluokkien aliluokkina omat poikkeusluokat on syytä toteuttaa?
Miten tarkistetun poikkeuksen saa ohjelmoitua tarkistamattomaksi poikkeukseksi?
Miksi näin voidaan haluta tehdä?
Miten seuraavat tilanteet olisi paras hoidella?
Heitetäänkö poikkeus vai tehdäänkö jotakin muuta? Jos poikkeus
heitetään, millainen?
Yritetään asettaa PassengerVehicle-olion matkustajakapasiteetiksi
negatiivinen arvo.
Oliota ollaan luomassa lukemalla sille alkutila tekstitiedostosta.
Tiedostossa on syntaksivirhe.
Metodin saama String-taulukkoparametri on tyhjä tai nollan alkion
mittainen.
"Open"-metodille annettua tiedostoa ei ole olemassa
"Open"-metodille annettu tiedosto on olemassa, mutta siihen ei ole
lukuoikeutta.
Yritetään avata tietoliikenneyhteyttä toiselle palvelimelle, mutta
palvelin ei vastaa.
Kesken toisen palvelimen kanssa käydyn keskustelun
tietoliikenneyhteys katkeaa.
Pohdiskele näitä tapauksia toisaalta operaatiota toteuttavan
metodin kannalta, toisaalta metodin kutsujan kannalta.
Selitä lyhyesti Javan väittämien (assert) käyttö, niiden
tarkoitus ja käyttäytyminen.
Vertaa omien väittämien käyttämistä Javan valmiisiin
tarkistuksiin (esim. virheellinen taulukon indeksi).
Mitä samaa ja mitä eroa näissä on?
Miten väittämien tarkistus saadaan päälle/pois?
Ohjelmoinnissa voidaan käyttää luokkainvariantteja
(class invariant), väittämiä luokan sallitusta sisäisestä
tilasta eli kenttien sallituista arvoista.
Mitä hyötyä näistä on ja miten niitä käytetään?
Nämä väittämät voidaan myös konkreettisesti ohjelmoida
Javan assert-lauseina. Anna esimerkkejä tästä tekniikasta.
Miten assert-tekniikka soveltuu alku- ja jälkiehtojen
(precondition and postcondition) ohjelmointiin?
Milloin on syytä käyttää assert-lauseita, milloin sen sijaan
on parempi heitellä poikkeuksia? Miksi?
Anna esimerkkejä molemmista.
Ohjelmoija haluaa varmistaa, että väittämät ovat aina "päällä"
joissakin ohjelman kohdissa. Tämän saa aikaan seuraavalla tempulla.
Selitä miksi?
boolean assertsEnabled = false;
assert assertsEnabled = true;
if (!assertsEnabled)
thrownew Java.lang.RuntimeException ("assertions must be enabled");