Helsingin yliopisto > Tietojenkäsittelytieteen laitos > Ohjelmointitekniikka (Java) -opintojakso keväällä 2005
Error
,
Exception
, RuntimeException
,
Throwable
.KauheaPoikkeus
on julkinen
parametriton konstruktori ja että kyseessä on checked-tyyppinen
poikkeusluokka. Laadi metodi vaarallinen()
, joka aiheuttaa
KauheaPoikkeus
-poikkeuksen käsittelemättä sitä itse.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.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) { } }
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.
Yhteispisteiden keskiarvoksi muodostui 4,8.
yhteispisteet | vastausten lukumäärä |
---|---|
6 | xxxxxxxxxxxxxxxxxxxxxx |
5 | xxxxxxxxxxxxxxxxxxxx |
4 | xxxxxxx |
3 | xxxxx |
2 | xxxx |
1 | x |
0 |