Ohjelmointitekniikka (Java) - harjoitukset 1, 21.-25.1.

  1. 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:
    1. Miksi poikkeusten heittäminen soveltuu erityisen hyvin kirjastoluokissa havaittujen virheiden käsittelyyn?
    2. Miksi poikkeuksia ei pitäisi käyttää ohjelman normaalin kontrollin kulun ohjaamiseen?
    3. Mitä tapahtuu, jos tulee poikkeus eikä sopivaa poikkeuskäsittelijää ole ohjelmoitu?
    4. Mihin finally-lohkot on tarkoitettu? Mitä tapahtuu, jos finally-lohko itse heittää poikkeuksen?

    1. 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.
    2. Milloin on syytä heittää tarkistettu, milloin tarkistamaton poikkeus? Miksi? Minkä poikkeusluokkien aliluokkina omat poikkeusluokat on syytä toteuttaa?
    3. Miten tarkistetun poikkeuksen saa ohjelmoitua tarkistamattomaksi poikkeukseksi? Miksi näin voidaan haluta tehdä?

  2. Miten seuraavat tilanteet olisi paras hoidella? Heitetäänkö poikkeus vai tehdäänkö jotakin muuta? Jos poikkeus heitetään, millainen?
    1. Yritetään asettaa PassengerVehicle-olion matkustajakapasiteetiksi negatiivinen arvo.
    2. Oliota ollaan luomassa lukemalla sille alkutila tekstitiedostosta. Tiedostossa on syntaksivirhe.
    3. Metodin saama String-taulukkoparametri on tyhjä tai nollan alkion mittainen.
    4. "Open"-metodille annettua tiedostoa ei ole olemassa
    5. "Open"-metodille annettu tiedosto on olemassa, mutta siihen ei ole lukuoikeutta.
    6. Yritetään avata tietoliikenneyhteyttä toiselle palvelimelle, mutta palvelin ei vastaa.
    7. Kesken toisen palvelimen kanssa käydyn keskustelun tietoliikenneyhteys katkeaa.
    Pohdiskele näitä tapauksia toisaalta operaatiota toteuttavan metodin kannalta, toisaalta metodin kutsujan kannalta.

    1. 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?
    2. 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.
    3. 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.
    4. 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)
               throw new Java.lang.RuntimeException ("assertions must be enabled");