Probleema on varsin simppeli, mutta en ole keksinyt kunnollista tapaa ratkaista ongelmaa. Eli alla olevassa koodissa, jos yritetään syöttää nollaa, se luetaan taulukkoon. Tarkoitus juurikin olisi ettei nollaa luettaisi taulukkoon. Miten saisin toteutettua sen ettei nollaa lueta taulukkoon, vaan heitetään (virhe)ilmoitus ja kysytään lukua uudelleen? Oma metodi vai löytyisikö joku toinen keino?
onko_int -metodi tuossa koodissa lukee kokonaisluvun ja käyttää poikkeuksenkäsittelyä virhesyötöille.
if (koko>=1) { taulukko=new int[koko]; for (int I=0;I<taulukko.length;I++) { // kysytään taulukon tiedot System.out.print("\nAnna luku\nLuku ei saa olla nolla !"); taulukko[I]=onko_int(); } }
En nyt ole aivan varma, mutta alkeistietotyypit ja oliot kannattaisi kirjoittaa pienellä, ne erottuisivat helpommin suorista luokkaviittauksista esim. "System.out.println"
. Saattaa kyllä olla, että muistelen code conventionit väärin. Tämä siis viitaten silmukkamuuttuja I:hin. Sitten onko_int() kuulostaa totuusarvon palauttavalta metodilta. Mieluummin vaikka readInt tms. Itse ongelma hoituu laittamalla seuraava syötteidenlukumetodiin:
if (kayttajansyote == 0) System.out.println("ZOMG SYÖTIT NOLLAN");
Jos käytät Arto Wiklan kirjoittamaa Lue-luokkaa, niin kluku-metodiin kun lisää catch-lauseeseen continue;
ja catch-lauseen jälkeen if (arvo == 0) ok=false;
Otin tuossa nyt tommosen lue_int -metodin käyttöön. Mitenkähän tohon voisi pistää tuon nollan tarkistuksen ja käsittelyn?
public static int lue_int() { BufferedReader stdin = new BufferedReader ( new InputStreamReader ( System.in)); int luku=0/*.0*/; boolean virhe; do { virhe=false; try { luku = Integer.valueOf(stdin.readLine()).intValue(); System.out.println(); } // try catch( Exception e) { virhe = true; System.err.println( "\n *** " +e +"\n"); System.out.print (" Yritä antaa kokonaisluku uudelleen > "); } // catch }while (virhe); // do .. while return luku; }
Tässäpä Wiklan luokasta otettu ja muokattu metodi:
public static int kluku() { int arvo=-1; boolean ok; do { try { arvo = Integer.parseInt(stdin.readLine()); ok = true; } catch (Exception e) { System.out.println("Kelvoton kokonaisluku. Anna uusi!"); ok = false; continue; } if (arvo == 0) { System.out.println("0 ei ole sallittu luku. Anna uusi!"); ok = false; } } while (!ok); return arvo; }
Jos lisäisit tuonne try-lohkoon tuon keskimmäisen:
luku = Integer.valueOf(stdin.readLine()).intValue(); if( luku == 0 ) throw new Exception("Nolla ei kelpaa."); System.out.println();
Pitäisi itsekkin opetella noita poikkeuksia.
edit: Ohops, tsuriga ehtikin ennemmin.
Jees, kiitoksia avusta. Nyt pelittää ja mieli on hyvä. :)
Tuossa kun ei käytetä e.getMessage() niin uuden poikkeustilanteen luonti viestillä ei auttaisi.
tsuriga kirjoitti:
Tuossa kun ei käytetä e.getMessage() niin uuden poikkeustilanteen luonti viestillä ei auttaisi.
Mihin koodiin tuolla viittaat? Jos tuohon tn:n koodiin, niin kyllä se mulla lähti toimimaan niin kuin pitikin.
Tuohon tn:n juu. Jaa, mutta heittääkös se konsoliin viestin "Nolla ei kelpaa"?
tsuriga kirjoitti:
Tuohon tn:n juu. Jaa, mutta heittääkös se konsoliin viestin "Nolla ei kelpaa"?
Joo, heittää tuon ilmoiuksen. Tosin itse hiukan muokkailin tuota tulostusta sun muuta koodia. Pelittää muuten niin kuin pitääkin. Mulla oli muussa koodissa semmonen homma, että esim. nolla lopettaa ohjelman suorituksen, joten jouduin hiukkasen muuttamaan koodia. Tossa mun lopullisessa metodissa suoritetaan käyttäjän syötteen (kokonaisluvun)lukeminen, mutta nollaa ei saa lukea, koska se "särkee" muun ohjelman toteutuksen. Kaikki käyttäjän syötteet luetaan tolla samalla metodilla, ja niitä syötteitä on paljon. Nyt toimii hyvin.
Sitä minä lähinnä, että tuollaisenaan se ei vielä tulostaisi tuota virheilmoitusta, kun eikös se pitäisi hakea Throwable.getMessagen kautta?
tsuriga kirjoitti:
Sitä minä lähinnä, että tuollaisenaan se ei vielä tulostaisi tuota virheilmoitusta, kun eikös se pitäisi hakea Throwable.getMessagen kautta?
Kyllä se tulostaa virheilmoituksen. Tiedä sitten mistä se kääntäjä sen kaivaa :).
lainaus:
Sitä minä lähinnä, että tuollaisenaan se ei vielä tulostaisi tuota virheilmoitusta, kun eikös se pitäisi hakea Throwable.getMessagen kautta?
Katsoppas tarkemmin sitä alkuperäistä koodia. Eikös siellä catch-lohkon toisessa lauseessa tulosteta se virheilmoitus?
Kappas niinpäs onkin :). Etsin vain nopsasti tuota getMessagea kun taas tuossa tulostetaan itse olio, joka ajaa tässä tapauksessa saman asian.
Ton virhe ilmotuksen saa tulostettua muuten suoraan käyttämällä Exception luokan omaa metodia: printStackTrace()
eli näin:
try{ tehdään jotain... }catch(Exception e){ tehtiin vissiin jotain väärin e.printStackTrace(); }
jollon se tulostaa koko litanian
Aihe on jo aika vanha, joten et voi enää vastata siihen.