Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java, taulukko ja nolla

Sivun loppuun

Snifferi [26.11.2004 11:03:07]

#

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();
   }
}

tsuriga [26.11.2004 11:25:28]

#

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;

Snifferi [26.11.2004 11:46:39]

#

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;
     }

tsuriga [26.11.2004 11:59:18]

#

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;
  }

tn [26.11.2004 12:05:15]

#

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.

Snifferi [26.11.2004 13:25:53]

#

Jees, kiitoksia avusta. Nyt pelittää ja mieli on hyvä. :)

tsuriga [26.11.2004 16:56:32]

#

Tuossa kun ei käytetä e.getMessage() niin uuden poikkeustilanteen luonti viestillä ei auttaisi.

Snifferi [26.11.2004 18:24:56]

#

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.

tsuriga [27.11.2004 00:50:46]

#

Tuohon tn:n juu. Jaa, mutta heittääkös se konsoliin viestin "Nolla ei kelpaa"?

Snifferi [27.11.2004 03:33:40]

#

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.

tsuriga [27.11.2004 04:09:45]

#

Sitä minä lähinnä, että tuollaisenaan se ei vielä tulostaisi tuota virheilmoitusta, kun eikös se pitäisi hakea Throwable.getMessagen kautta?

Snifferi [27.11.2004 04:21:50]

#

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 :).

tn [27.11.2004 23:23:21]

#

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?

tsuriga [28.11.2004 00:01:04]

#

Kappas niinpäs onkin :). Etsin vain nopsasti tuota getMessagea kun taas tuossa tulostetaan itse olio, joka ajaa tässä tapauksessa saman asian.

maka78 [28.11.2004 16:02:04]

#

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


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta