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

871

    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. Veroaste on Suomessa viitisen prosenttiyksikköä liian matala

      Veropohjaa on rapautettu käytännössä koko kulunut vuosituhat, jonka vuoksi valtion menoja on jouduttu rahoittamaan velka
      Maailman menoa
      70
      2447
    2. Tiedän satavarmasti ettet tule koskaan

      Uskaltamaan mitään. Ei me tulla edes näkemään koskaan.
      Ikävä
      67
      1425
    3. Kyläkauppias ajoi kännissä töistä kotiin

      Ei edes kallis auto estä humalassa ajamista, vaikka luulisi alkolukko olevan sellaisessa jo vakiovarusteena. https://ww
      Maailman menoa
      80
      1283
    4. EU komissio - EU-elpymisrahoja voidaan käyttää TILAPÄISESTI väärin!

      Espanja ohjasi miljardeja euroja – Nyt EU-komissio teki yllättävän paljastuksen Skandaaliksi noussut Espanjan EU-rahoje
      Maailman menoa
      11
      1182
    5. Miks me oikein

      Rakastuttiin vaikka kaikki on mahdotonta?
      Ikävä
      79
      885
    6. Kiitos upeasta palvelusta kukkamyyjä

      Kiitos sinulle upea kaunis kukkamyyjä Kuhmon torilla 🌹 Upea iloinen asenteesi ja kaunis hymysi pelasti päiväni ❤️ Jäi
      Kuhmo
      19
      880
    7. Nainen, mikset lähetä

      miehelle viestiä? Tiedän, että sulla on asiaa ja kysyttävää.
      Ikävä
      54
      763
    8. Ratikka Turkuun

      Ei hyvä. Ja syy on siinä , kukaan ei osaa suunnitella oikeaa reittiä. Pitää huomioide, kiskoja sijaintia ei voi muutta
      Turku
      98
      736
    9. Miehet trikoissaan

      On se kauhian näkköistä, kun miehet tiukossa trikkoissa juoksentelloo ja mulukku paestaa trikkoijjen läpi. Kahtokkee pe
      Suomussalmi
      28
      722
    10. Rakastan sinua

      Yhä.
      Ikävä
      30
      686
    Aihe