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

839

    Vastaukset

    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. Tänään pyörit ajatuksissa enemmän, kun erehdyin lukemaan palstaa

      En saisi, silti toivon että sinä vielä palaat ja otetaan oikeasti selvää, hioituuko särmät ja sulaudummeko yhteen. Vuod
      Ikävä
      30
      5740
    2. Huomenta ihana

      Kauniskasvoinen ihanuus 😘 saan sut vielä
      Ikävä
      34
      5150
    3. Hei rakas...

      Miten on työpäivä sujunut? Rakastan sinua 💗
      Ikävä
      29
      2944
    4. Edelleen sitä on vaikea uskoa

      Että olisit oikeasti rakastunut muhun
      Ikävä
      34
      2424
    5. Toiveikas vai toivoton

      torstai? Ajatuksia?
      Ikävä
      37
      2098
    6. Vitsi mihin menit. Heti takasin.

      Mä näin sut tuu takasin! Oli kiire, niin en ehtiny sin perään!
      Ikävä
      15
      2048
    7. Ei tämä etene ikinä

      Kun kumpikaan ei enää ota yhteyttä. Mä en ainakaan uskalla.
      Ikävä
      30
      1768
    8. En ole koskaan kokenut

      Ennen mitään tällaista rakastumista. Tiedän että kaipaan sinua varmaan loppu elämän. Toivottavasti ei tarvitsisi vain ka
      Ikävä
      19
      1667
    9. Mukavaa päivää

      Mun rakkauden kohteelle ❤️ toivottavasti olet onnellinen
      Ikävä
      12
      1661
    10. Voi ei! Jari Sillanpää heitti keikan Helsingissä - Hämmästyttävä hetki lavalla...

      Ex-tangokuningas on parhaillaan konserttikiertueella. Hän esiintyi Savoy teatterissa äitienpäivänä. Sillanpää jakoi kons
      Suomalaiset julkkikset
      36
      1593
    Aihe