Helsingin yliopisto > Tietojenkäsittelytieteen laitos > Ohjelmointitekniikka (Java) -opintojakso keväällä 2005

Koetehtävän 1 arvostelukertomus

Tehtävä

  1. Selitä seuraavien luokkien perintähierarkia: Error, Exception, RuntimeException, Throwable.
  2. Mitkä poikkeukset ovat checked-poikkeuksia, mitkä taas unchecked-poikkeuksia? Miten ne eroavat toisistaan poikkeusten käsittelemisen kannalta?
  3. Oletetaan, että luokalla KauheaPoikkeus on julkinen parametriton konstruktori ja että kyseessä on checked-tyyppinen poikkeusluokka. Laadi metodi vaarallinen(), joka aiheuttaa KauheaPoikkeus-poikkeuksen käsittelemättä sitä itse.
  4. Laadi metodi toiveikas(), joka kutsuu edellisessä kohdassa laatimaasi metodia vaarallinen() ja jollakin tavoin käsittelee sen mahdollisesti aiheuttaman poikkeuksen. Metodi toiveikas() siis ei aiheuta mitään poikkeusta.

Esimerkkivastaus

RuntimeException-luokka on Exception-luokan aliluokka. Exception-luokka ja Error-luokka ovat Throwable-luokan aliluokkia.

RuntimeException-tyyppiset poikkeukset ovat unchecked-poikkeuksia. Muut poikkeukset ovat checked-poikkeuksia. Checked-poikkeus eroaa unchecked-poikkeuksesta siten, että jos lause voi aiheuttaa checked-poikkeuksen, niin on pakko joko käsitellä poikkeus (try-catch-rakenteella) tai välittää poikkeus nykyisen metodin kutsujalle (throws-ilmaisulla).

public void vaarallinen() throws KauheaPoikkeus {
    throw new KauheaPoikkeus();
}

public void toiveikas() {
    try {
        vaarallinen();
    } catch (KauheaPoikkeus kp) {
    }
}

Pisteytys

Vastauksesta sai enintään 6 koepistettä. Vastaus arvosteltiin ensin raakapistein, joita sai enintään 12. Tämän jälken raakapisteiden summa skaalattiin koepisteiksi jakajalla 2. Pyöristykset suoritettiin ylöspäin.

RuntimeException-luokka on Exception-luokan aliluokka. Exception-luokka ja Error-luokka ovat Throwable-luokan aliluokkia.

Vastauksesta sai enintään kolme raakapistettä.

Kolme pistettä sai, jos luokkien hierarkiassa oli kaikki kolme välitöntä perimissuhdetta oikein eikä ylimääräisiä suhteita. Kaksi pistettä sai, jos luokkien hierarkiassa oli kaksi välitöntä perimissuhdetta oikein. Yhden pisteen sai, jos luokkien hierarkiassa oli edes yksi perimissuhde oikein edes välillisesti.

Hierarkian perusteella saaduista pisteistä vähennettiin yksi piste, jos Throwable-luokkaa oli väitetty rajapintaluokaksi (joko suoraan tai sanomalla että jokin luokka toteuttaa Throwable-luokan) tai hierarkiaan oli lisätty luokkia, joita ei ole olemassa (esimerkiksi CheckedException tai UncheckedException).

Luokkien ominaisuuksien selittämistä ei tehtävässä pyydetty, joten siitä ei saanut pisteitä.

RuntimeException-tyyppiset poikkeukset ovat unchecked-poikkeuksia. Muut poikkeukset ovat checked-poikkeuksia. Checked-poikkeus eroaa unchecked-poikkeuksesta siten, että jos lause voi aiheuttaa checked-poikkeuksen, niin on pakko joko käsitellä poikkeus (try-catch-rakenteella) tai välittää poikkeus nykyisen metodin kutsujalle (throws-ilmaisulla).

Vastauksesta sai enintään neljä raakapistettä.

Yhden pisteen sai unchecked-poikkeusten tyypin selostamisesta ja yhden pisteen checked-poikkeusten tyypin selostamisesta. Vastauksissa sallittiin pieni määrä epätäsmällisyyttä, esimerkiksi ilmaisulla "RuntimeExceptionin aliluokat" tulkittiin tarkoitetun "RuntimeException-luokka tai sen aliluokat".

Varautumistavoista checked-tyyppiseen poikkeukseen sai yhden pisteen kummastakin. Ilmauksen "heitetään eteenpäin" tulkittiin tarkoittavan "välitetään poikkeus nykyisen metodin kutsujalle". Jotkut vastaajat ovat ehkä luulleet, että "eteenpäin heittämisessä" on käytettävä koodissa olevaa throw-ilmaisua eikä metodin otsakkeessa olevaa throws-ilmaisua. Tätä väärää luuloa ei kuitenkaan voitu luotettavasti erottaa oikeasta luulosta, joten arvostelussa kallistuttiin vastaajalle edullisempaan tulkintaan. Myös ilmaukset "propagoidaan poikkeus ylöspäin" ja "pistetään poikkeus kutsujan ongelmaksi" tulkittiin suotuisasti.

Error-tyyppisiä olioita koskevaa tekstiä ei huomioitu, sillä kysymys koski vain poikkeuksia eli Exception-tyyppisiä olioita.

public void vaarallinen() throws KauheaPoikkeus {
    throw new KauheaPoikkeus();
}

Vastauksesta sai enintään kolme raakapistettä.

Yhden pisteen sai mahdollisen poikkeuksen ilmoittamisesta metodin otsakkeessa throws KauheaPoikkeus -ilmaisulla. Piste jäi saamatta esimerkiksi jos ilmaisu puuttui, oli virheellinen tai oli väärässä kohdassa.

Yhden pisteen sai poikkeusolion luomisesta. Piste jäi saamatta esimerkiksi jos varattu sana new puuttui tai konstruktorisulkeet puuttuivat.

Yhden pisteen sai poikkeusolion heittämisestä. Piste jäi saamatta esimerkiksi jos varattu sana throw puuttui tai oli virhellisesti throws tai heittämistä yritettiin kutsumalla poikkeusolion throw-metodia (sellaista ei ole olemassa).

Muihin kuin poikkeuksiin liittyviin virheisiin ei puututtu.

public void toiveikas() {
    try {
        vaarallinen();
    } catch (KauheaPoikkeus kp) {
    }
}

Vastauksesta sai enintään kaksi raakapistettä.

Yhden pisteen sai vaarallinen-metodin kutsumisesta try-lohkon sisällä. Piste jäi saamatta esimerkiksi jos try-lohko puuttui, metodia ei kutsuttu ollenkaan, kutsuttiin jotakin muuta kuin vaarallinen-metodia, metodin kutsumisen asemesta luotiin Vaarallinen-tyyppinen olio tai vaarallinen-metodin kuviteltiin olevan KauheaPoikkeus-tyyppisen olion metodi.

Yhden pisteen sai KauheaPoikkeus-tyyppisen olion ottamisesta kiinni catch-lohkon sisällä. Pitkin hampain hyväksyttiin myös kaikkien Exception-tyyppisten olioiden kiinniottaminen. Piste jäi saamatta esimerkiksi jos catch-lohko puuttui tai kiinni otettavan olion tyypin tai muutujanimen määrittelyssä oli jokin virhe.

Muihin kuin poikkeuksiin liittyviin virheisiin ei puututtu.

Pisteiden jakauma

Yhteispisteiden keskiarvoksi muodostui 4,8.

Taulukko 1. Pisteiden jakauma
yhteispisteet vastausten lukumäärä
6 xxxxxxxxxxxxxxxxxxxxxx
5 xxxxxxxxxxxxxxxxxxxx
4 xxxxxxx
3 xxxxx
2 xxxx
1 x
0