virheenkäsittely

matt4556

Joo eli oon tehnyt lainalaskurin johon tarvitsisin virheentarkistuksia. Ohjelmassa kysytään lainasummaa,korkoprosenttia ja laina-aikaa kokonaisina vuosina. Miten voin tehdä niin, että jokaiseen on pakko syöttää lukuja (jos syöttää kirjaimen niin tulee virheilmoitus eikä saa jättää tyhjäksi)ja vuodet saa olla vain kokonaisina eli jos syöttää desimaalilukuja niin tulee virheilmoitus. Jos virhe sattuu niin ohjelma ei kuitenkaan kaadu vaan se kysyy kysymyksen uudelleen.

Kiitos vastanneille

4

875

    Vastaukset 4

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Nero Burner

      edit-controllia

    • jaded83

      Elikkä jos haluat tehdä jotakuinkin hyvin.

      KIINTEÄ DOKUMENTTI:
      Luo uusi luokka, joka periytyy javax.swing.text.PlainDocument luokasta. Ylikirjoita insertString(int, String, AttributeSet) metodi, jossa tarkistat kuinka monta merkkiä voit hyväksyt.
      Nyt sinulla täytyy olla tiedossa maksimi määrä merkkejä, getLength() metodilla saat tietoosi dokumentin pituuden, jos tuodaan enemmäin kuin 1 merkkiä samanaikaisesti on loppupäästä leikattava ylimääräiset pois. Lopuksi aseta tämä dokumentti teksti kentällesi (esim. JTextField).

      HYVÄKSYY VAIN NUMEROITA:
      Luo uusi luokka, joka periytyy javax.swing.text.DocumentFilter luokasta. Ylikirjoita insertString(DocumentFilter.FilterBypass, int, String, AttributeSet) ja replace(DocumentFilter.FilterBypass, int, int, String, AttributeSet) metodit, joissa formatoit tekstin ensin jollain tietyllä kaavalla esim. java.util.regex.Pattern luokalla Pattern.compile("[^0-9]").
      Seuraavaksi suorita String[] merkit = getPattern().split(text) kaikki mitä merkit taulukossa on, niin hyväksytään. Jos haluat käyttää desimaali lukuja niin muuta kaava "[^0-9.]" muotoon ja pisteelle tarkistus, että vain yksi voidaan antaa.
      Kun jokin muu kuin numero kirjain syötetään niin kutsut vaikkapa java.awt.Toolkit.getDefaultToolkit().beep(), eli kun formatoidun tekstin pituus on 0 tai != alkuperäinen.

      NUMEERINEN TEKSTI KENTTÄ:
      Jos haluat vielä jatkaa, niin luo luokka joka perityy JTextField komponentista. Sen kunstruktorin argumenteiksi (int maxLength, Class numberClass) numberClass olisi joko Integer tai Double. Yllä mainittuja luokkia hyväksi käyttäen tämä toimii.
      Numeerisen arvon saat seuraavasti (Number)numberClass.getConstructor(new Class[]{java.lang.String.class}).newInstance(text), jos tekstin pituus on 0 niin text muuttuja korvataan "0" arvolla.
      Jos haluat vielä jatkaa, niin implementoida AccessibleValue rajapinnan AccessibleJTextField luokkaan (protected JTextField.AccessibleJTextField) ja kutsua accessibleContext.firePropertyChange(AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, null, n) aina kun jokin numero syötettiin teksti kenttään.

    • if-else

      Alla esimerkki jossa syötteen lukuun käytetään scanneria ja muunnoksen Double/Integer luokkan parse -metodia.

      --- ALKAA ---

      import java.util.Scanner;

      public class Esimerkki {
         
         public static double kysyDouble(Scanner lukija, String kysymys) {
            while(true)
               try {
                  System.out.print(kysymys);
                  return Double.parseDouble(lukija.nextLine().trim());
               } catch(NumberFormatException e) {
                  System.out.println("Virheellinen arvo!");
               }
         }
         
         public static int kysyInt(Scanner lukija, String kysymys) {
            while(true)
               try {
                  System.out.print(kysymys);
                  return Integer.parseInt(lukija.nextLine().trim());
               } catch(NumberFormatException e) {
                  System.out.println("Virheellinen arvo!");
               }
         }
         
         public static void main(String[] moi) {
            Scanner lukija = new Scanner(System.in);
            
            double lainasumma = kysyDouble(lukija, "Lainasumma: ");
            double korkoprosentti = kysyDouble(lukija, "Korkoprosentti: ");
            int lainaaika = kysyInt(lukija, "Laina-aika: ");
            
            System.out.println(
                  "Syötit: \n\n"
                  " Lainasumma: " lainasumma "\n"
                  " Korkoprosentti: " korkoprosentti "\n"
                  " Laina-aika: " lainaaika
            );
         }
      }

      --- LOPPUU ---

      • jaded83

        No jos käyttäjä tajuaa, että vain numeroita. Pitemmällä tähtäimellä ei hyvä.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Naiset ymmärtävät ettei talous lähde nousuun

      Miten paljon järjellisempi olento nainen onkaan kuin tilastollisestikin paremmin tienaava mies. Kun kaikkialla puskuroid
      Maailman menoa
      159
      1061
    2. En jaksa

      Enää pelleillä ja paljastan J naisen nimen. Se on Jonna ja hän ei koskaan, edes luultavasti ollut täällä. Silti piene
      Ikävä
      44
      717
    3. Kissa eli kivuissa useita viikkoja

      Ei vienyt lääkäriin vaikka kissa parka maukui ja moni seuraajakin (minäkin) näin että kissa on sairas.
      Tuusniemi
      128
      666
    4. Minkälainen nainen

      Minkälainen kaipaamasi nainen on luonteeltaan? Kaikki hassun hauskat antava ja helppo on sallittuja, jos poikien on kovi
      Ikävä
      23
      648
    5. Yksi asia sen esti

      Etten antanut meille mahdollisuutta
      Ikävä
      44
      639
    6. Okei, eli olet rakastunut

      Hyvä sinä, niin minäkin.
      Ikävä
      67
      615
    7. Martinan mauton tyyli

      Voi hyvää päivää 🤣 nyt ollaan oltu Muhiksen kanssa Kultareservin avajaisissa suorat housut jalassa ja 500€ korsetti pää
      Kotimaiset julkkisjuorut
      161
      571
    8. Jos meillä olisi yhteinen koti

      Niin haittaisiko sinua pitää se vähä tavaraisena? Ajattelin tänään että jos joskus asuttaisiin yhdessä ja haluaisit pal
      Ikävä
      52
      560
    9. Arvaako kukaan?

      "Humalojalla metalliromun keräyspaikalla on kulkenut pitkin kevättä ja kesää joku henkilö, joka on vienyt sieltä kymmeni
      Haapavesi
      34
      554
    10. Tuntuu pahalta meidän molempien puolesta

      Anteeksi, että olen tällainen pelkuri. En vaan usko rakkauteen enää miehen ja naisen välillä omalla kohdalla. Tiedän, et
      Ikävä
      34
      528
    Aihe