Try-Catch

Miten tarkistetaan, jos halutaan, että matka ja aika ovat kokonaislukuja ja annetaan virheilmoitus label1:een, jos eivät ole...miten tuo pitäisi koodata?
   String error = "";
   int kmMatka = -1;
   int aTunti = -1;

   try
      {
      kmMatka= (km);      
      }
      
      
   catch (Exception ex)      
      {
      error = "Matkan on oltava kokonaisluku";
      }

   try
      {
      aTunti = (a);
      }
         
   catch (Exception ex)
      {
      error = error "Ajan on oltava kokonaisluku";
      }

   if(error.length()>0)   {
      label1.setText("Syötä tiedot uudelleen");
9885
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

Luultavasti tuosta aiheutuu NumberFormatException, jos yritetään laittaa vääränlaisia lukuja muuttujaan. Mutta vähän jäi epäselväksi, että minkätyyppisiä muuttujia nuo km ja a ovat=

Äänestä
  • Siellähän ne muuttujat oli esitelty ennen try-lohkoa...

    Äänestä

  • Piru kirjoitti:

    Siellähän ne muuttujat oli esitelty ennen try-lohkoa...

    Ei ollu esitelty a:ta ja km:ää

    Äänestä

  • muttujat ovat int-typpisiä, siksi koska ne pitäisi olla kokonaislukuja vastauksessa.

    Äänestä

  • jade kirjoitti:

    muttujat ovat int-typpisiä, siksi koska ne pitäisi olla kokonaislukuja vastauksessa.

    try{
    Ingeger.parseInt(textfield.getText());

    }catch (Exception e){label.setText("anna kokonaisluku");}

    Äänestä

  • foo kirjoitti:

    try{
    Ingeger.parseInt(textfield.getText());

    }catch (Exception e){label.setText("anna kokonaisluku");}

    Juuri näin.
    Tässähän siis Integer-luokkametodi.
    Vielä varmemmaksi varmuudeksi alkuperiäiseen koodiin:

    String error = "";
    int kmMatka = -1;
    int aTunti = -1;
    try
    {
    kmMatka = Integer.parseInt(km);
    }
    catch (NumberFormatException ex)
    {
    error = "Ajan on oltava kokonaisluku";
    label1.setText("Syötä tiedot uudelleen");
    }


    Näin jos nimenomaan haluat napata vain numeroformaatti virheet mutta yleinen Exeption-luokka käy myö mainiosti

    Äänestä

  • ammatilainen kirjoitti:

    Juuri näin.
    Tässähän siis Integer-luokkametodi.
    Vielä varmemmaksi varmuudeksi alkuperiäiseen koodiin:

    String error = "";
    int kmMatka = -1;
    int aTunti = -1;
    try
    {
    kmMatka = Integer.parseInt(km);
    }
    catch (NumberFormatException ex)
    {
    error = "Ajan on oltava kokonaisluku";
    label1.setText("Syötä tiedot uudelleen");
    }


    Näin jos nimenomaan haluat napata vain numeroformaatti virheet mutta yleinen Exeption-luokka käy myö mainiosti

    > Juuri näin.
    > Tässähän siis Integer-luokkametodi.

    Aika yleinen tapa, mutta täytyy muistaa, että Javassa on yksi hidas toimenpide: Se on poikkeuksien heitttäminen. Silloin JVM vetää jarrut päälle ja alkaa miettiä, että mitäs polkua tuo säie oikeastaan tuohon virheeseen tulikaan.

    Eli kenties parempi tapa olisi käyttää jotain valmiskirjastoa, joka ei heitä poikkeusta, vaan ilmoittaa, että oliko siinä stringissä ylimääräisiä kirjaimia vai ei.

    http://www.opensymphony.com/oscore/utility.html#textutils
    http://jakarta.apache.org/commons/validator/index.html

    > Näin jos nimenomaan haluat napata vain
    > numeroformaatti virheet mutta yleinen
    > Exeption-luokka käy myö mainiosti

    Ei, ei ja ei. "Joku siellä liikkuu; ammu sitä ydinpommilla" ??? Todella huono idea.

    Voisihan siinä napata Throwablenkin, mutta kaikkea ei kannata tehdä, mikä jossain sattumalta toimii.

    Lisää aiheesta:
    http://www.churchillobjects.com/c/11012h.html

    Äänestä

  • ~~~ kirjoitti:

    > Juuri näin.
    > Tässähän siis Integer-luokkametodi.

    Aika yleinen tapa, mutta täytyy muistaa, että Javassa on yksi hidas toimenpide: Se on poikkeuksien heitttäminen. Silloin JVM vetää jarrut päälle ja alkaa miettiä, että mitäs polkua tuo säie oikeastaan tuohon virheeseen tulikaan.

    Eli kenties parempi tapa olisi käyttää jotain valmiskirjastoa, joka ei heitä poikkeusta, vaan ilmoittaa, että oliko siinä stringissä ylimääräisiä kirjaimia vai ei.

    http://www.opensymphony.com/oscore/utility.html#textutils
    http://jakarta.apache.org/commons/validator/index.html

    > Näin jos nimenomaan haluat napata vain
    > numeroformaatti virheet mutta yleinen
    > Exeption-luokka käy myö mainiosti

    Ei, ei ja ei. "Joku siellä liikkuu; ammu sitä ydinpommilla" ??? Todella huono idea.

    Voisihan siinä napata Throwablenkin, mutta kaikkea ei kannata tehdä, mikä jossain sattumalta toimii.

    Lisää aiheesta:
    http://www.churchillobjects.com/c/11012h.html

    Exceptioneita tulee toki välttää.... Sillä niiden käsittely on hidasta (Mutta ei NÄIN hidasta).

    Mutta tämä kommentti ei ole enää semanttista kaunopuheisuutta, tahi "hyvän ohjelmointitavan" opettamista. Kommentoijan pointti on oman näsäviisautensa esilletuominen kaikkitietävänä guruna.


    Tämäntyyppisessä, yhden arvon lukemisessa erillisen, ei standardin luokkakirjaston käyttäminen on hyttysen ampumista ydinaseella, eikä sillä ole mitään tekoa sen kanssa, mikä on oikein ja mikä väärin.
    Eri asia on sitten, jos rakennetaan jotain ydinvoimalan guita (silloin kannattaa java muutenkin unohtaa), yleisin aloittelevan nörttikooderin tekemä virhe on paisuttaa projektiaan turhan pikkumaisilla nokkeluuksilla, ja sijoittaa jokaiseen projektiinsa sata megaa ylimääräisiä kirjastoja.

    Äänestä

  • foo kirjoitti:

    Exceptioneita tulee toki välttää.... Sillä niiden käsittely on hidasta (Mutta ei NÄIN hidasta).

    Mutta tämä kommentti ei ole enää semanttista kaunopuheisuutta, tahi "hyvän ohjelmointitavan" opettamista. Kommentoijan pointti on oman näsäviisautensa esilletuominen kaikkitietävänä guruna.


    Tämäntyyppisessä, yhden arvon lukemisessa erillisen, ei standardin luokkakirjaston käyttäminen on hyttysen ampumista ydinaseella, eikä sillä ole mitään tekoa sen kanssa, mikä on oikein ja mikä väärin.
    Eri asia on sitten, jos rakennetaan jotain ydinvoimalan guita (silloin kannattaa java muutenkin unohtaa), yleisin aloittelevan nörttikooderin tekemä virhe on paisuttaa projektiaan turhan pikkumaisilla nokkeluuksilla, ja sijoittaa jokaiseen projektiinsa sata megaa ylimääräisiä kirjastoja.

    > Kommentoijan pointti on oman näsäviisautensa
    > esilletuominen kaikkitietävänä guruna.

    Teknisellä keskustelupalstalla käsittääkseni pyritään pääsemään parhaaseen ratkaisuun jossain tietyssä ongelmassa. Jos joku "ammattilaisena" neuvoo aloittelijoita sutaisemaan takapuoltaan ja nuolemaan (catch Exception), niin mielestäni asiasta kannattaa huomauttaa.

    > yleisin aloittelevan nörttikooderin tekemä virhe
    > on paisuttaa projektiaan turhan pikkumaisilla
    > nokkeluuksilla, ja sijoittaa jokaiseen
    > projektiinsa sata megaa ylimääräisiä kirjastoja.

    Yleisin vihernokkien tekemä virhe on olla käyttämättä mitään valmiskirjastoja ja koodata sata tuhatta riviä paskaa, ennen kuin huomataan, että "hei, täähän on ihan vituralleen home-made tehty joka paikassa".

    Äänestä

Kommentoi aloitusta


Jade kirjoitti:

Miten tarkistetaan, jos halutaan, että matka ja aika ovat kokonaislukuja ja annetaan virheilmoitus label1:een, jos eivät ole...miten tuo pitäisi koodata?
   String error = "";
   int kmMatka = -1;
   int aTunti = -1;

   try
      {
      kmMatka= (km);      
      }
      
      
   catch (Exception ex)      
      {
      error = "Matkan on oltava kokonaisluku";
      }

   try
      {
      aTunti = (a);
      }
         
   catch (Exception ex)
      {
      error = error "Ajan on oltava kokonaisluku";
      }

   if(error.length()>0)   {
      label1.setText("Syötä tiedot uudelleen");

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu