nyt pukkaa outoa virhettä kun teen sitä Quest of ASCII:ta: nyt hommaan noita kaatumisia pois, joten try/catch-lauseita tulee paljon. tuli juuri sellainen outo tilanne, että kun yritin Napata Scanner luokan InputMismatchExceptionia, niin kääntäjä valittaa ettei löydä "symbolia"... elikkä
try { int muuttuja = Lue.nextInt(); } catch (InputMismatchException e) {}
hmm... sitten vielä yksi juttu: miten voin siepata monta virhettä samalla catch-lauseella?
Helpompaa on siepata monta kuin yksi virhe. Laita catch (Exception e), niin saat kaikki Exception-luokan virheet, mutta useinkin sinun on syytä erotella, mitä siepataan. Muun muassa siksi, että jos nappaa mitä vaan, niin sieltä voikin tulla ihan eri virheitä kuin osaat odottaa. Tämä paljastuu, kun täsmennät minkä virheen missäkin kohdassa nappaat.
siksi juuri sieppaankin juuri tuon InputMismatchin ja ArrayOutOfBoundsExceptionin, ettei ohjelma kaadu, sillä se ei näyttänyt pysyvän käynnissä ainoastaan Exceptionin sieppaamisella... mutta onko kellään tietoa, mistä tuo virhe voi johtua. ja myöskin haluaisin sen monen virheen nappaamisen kerralla.
Edit: oli muuten aika erikoista kun ohjelman kaatuessa komentorivi sanoi että virhe sijaitsee Scanner luokan rivillä 28xx ja muita yli 2000 xD ei kai siellä mitään...
Tommittaja kirjoitti:
kääntäjä valittaa ettei löydä "symbolia"...
import java.util.InputMismatchException;
Tommittaja kirjoitti:
mutta onko kellään tietoa, mistä tuo virhe voi johtua
aa, no taidan sitten importata koko util luokan kerralla. eli import java.util.*;
Tommittaja kirjoitti:
siksi juuri sieppaankin juuri tuon InputMismatchin ja ArrayOutOfBoundsExceptionin, ettei ohjelma kaadu, sillä se ei näyttänyt pysyvän käynnissä ainoastaan Exceptionin sieppaamisella...
Juuri päinvastoin, Exception on noiden yliluokka eli ne ovat kumpikin Exceptioneja. Exception ei siis ole "ainoastaan" jotain, vaan sisältää nuo molemmat ja paljon muuta.
Monta virhettä napataan kerralla sieppaamalla joku niiden yliluokka, äärimmillään Throwable, joka kattaa kaikki Exceptionit ja myös Errorit. Pelkästään kaksi tiettyä virhettä voisi pyydystää vain, jos jollain luokalla olisi aliluokkana ne eikä mitään muuta. Muuten pitää käyttää kahta catch-lohkoa, mutta eihän niiden koodia tarvitse tuplana kirjoittaa, jos se on sama tai lähes sama, vaan teet siitä erillisen metodin.
Luokkien perimishierarkia selviää Javan API-kuvauksesta, sieltä voi katsoa vaikka mikä on lähin yhteinen yliluokka kahdelle luokalle. Kannattaa lukea joku Java-opas, jossa selitetään periytymiset ym. koska Javassa ei pärjää kovin pitkään ymmärtämättä niitä.
Muttakun siinä on vaan tämä ongelma: laitan catch (Exception e) niin se sanoo, että ohjelma kaatuu ArrayIndexOutOfBoundsiin. Taas kun laitan catch (ArrayIndexOutOfBoundsException e) se sanoo että InputMismatchException... ilkeätä..
PS: tajusin kyllä pointtisi, mutta tuo exception ei oikein nyt toimi oikein :D
try { // ... } catch (InputMismatchException e) { // Tuli InputMismatchException } catch (ArrayIndexOutOfBoundsException e) { // Tuli ArrayIndexOutOfBoundsException } catch (IOException e) { // Tuli IOException } catch (Exception e) { // Tuli joku muu poikkeus kuin jokin noista kolmesta ylemmästä }
mutta tuon Exceptioninhan pitäisi siepata kaikki Exception luokan virheet mutta se kaatuu silti ArrayIndexiin... ? omistuista. pitäiskö sitten laittaa joku Throws Exception ;D
Edit: mutta kiitos tuosta tekniikasta. kokeilen.
Tuossa kokeillaan tehdä try-lohkossa jotain, mutta jos se virhe on jossain noista kolmesta, niin jäädään siihen lohkoon. Jollei se ole niissä missään, mutta tulee virhe niin mennään Exception e-kohtaan. Ja jollei virheitä ole, niin normaalisti suoritusta jatketaan noidenkin ohi.
laitoin tossa just tällasen koodin:
int ukkovalinta = 0; try { ukkovalinta = Lue.nextInt(); } catch (ArrayIndexOutOfBoundsException e) { } catch (InputMismatchException e) { } catch (Exception e) {}
ja se kaatui... ArrayIndexOutOfBoundsiin!?? mitä ihmettä
Katsohan vielä millä rivillä se poikkeus tulee... Scanner.nextInt() ei koskaan heitä ArrayIndexOutOfBoundsExceptionia ja muutenkin tuo catch-lohko pitäisi huolen siitä, että käsittelet sen virheen jos sellainen ilmenee (tässä tapauksessa käsittely tosin on että et tee mitään).
ai KIITOS! sehän on ihan selvä trycatchin väärä paikka kun tuo char tauluhan sen virheen heittää... :D kiitos!
Edit: nyt tuli toisenlainen ongelma: kun se nappaa sen virheen, se on whilen sisällä niin se menee ikuiseen silmukkaan... :(
Aihe on jo aika vanha, joten et voi enää vastata siihen.