Wyjątek numberformatexception

0

Mam takie zadanie ale nie wiem jak sie za nie zabrać:
Utwórz klasę Osoba wraz z polami:
• String imie;
• String nazwisko;
• int rok urodzenia;
• boolean plec;
• short kodPocztowy.
Klasę wzbogać o konstruktor, który zainicjuje pola wartościami wprowadzonymi z
konsoli przy wykorzystaniu strumienia System.in. Jeżeli wprowadzane przez użytkownika dane nie będą odpowiadały rodzajowi pola, należy podnieść wyjątek NiewlasciweDaneException.
Realizację zadania przetestuj tworząc przynajmniej 3 obiekty klasy Osoba.

Zrobiłem coś takiego ale wydaje mi się zbyt toporne i nie działa tak jakbym chciał:

public class Osoba {

    String imie, nazwisko;
    int rokUrodzenia;
    boolean plec;
    short kodPocztowy;

    Osoba() throws NiewlasciweDaneException {

        System.out.println("Wprowadz imie");
        Scanner odczyt1 = new Scanner(System.in);
        this.imie = odczyt1.nextLine();


        System.out.println("Wprowadz nazwisko");
        Scanner odczyt2 = new Scanner(System.in);
        this.nazwisko = odczyt2.nextLine();

        System.out.println("Wprowadz rok urodzenia");
        Scanner odczyt3 = new Scanner(System.in);
        String o3 = odczyt3.nextLine();
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher matcher = pattern.matcher(o3);
        int a = Integer.parseInt(o3);
        if (matcher.matches() && (a >= -2147483648 && a <= 2147483647)) {
            this.rokUrodzenia = a;
        } else {
            throw new NiewlasciweDaneException();
        }


        System.out.println("Czy jestes mezczyzna?");
        Scanner odczyt4 = new Scanner(System.in);
        String o4 = odczyt4.nextLine();
        if (o4 == "true") {
            this.plec = true;
        } else if (o4 == "false") {
            this.plec = false;
        } else {
            throw new NiewlasciweDaneException();
        }


        System.out.println("Wprowadz kod pocztowy");
        Scanner odczyt5 = new Scanner(System.in);
        String o5 = odczyt5.nextLine();
        Pattern pattern2 = Pattern.compile("[0-9]*");
        Matcher matcher2 = pattern2.matcher(o3);
        Short b = Short.parseShort(o3);

        if (matcher2.matches() && (b >= -32768 && b <= 32767)) {
            this.kodPocztowy = b;
        } else {
            throw new NiewlasciweDaneException();
        }


    }

}

Jak to zrobic lepiej?

0

Co to znaczy, że nie działa tak jakbyś chciał? Bo wg mnie po prostu nie działa. Co mam odpowiedzieć na "Czy jestes mezczyzna?" żebym doszedł do kodu pocztowego?

0

na te pytanie trzeba znac hasło.

0
szweszwe napisał(a):

Co to znaczy, że nie działa tak jakbyś chciał? Bo wg mnie po prostu nie działa. Co mam odpowiedzieć na "Czy jestes mezczyzna?" żebym doszedł do kodu pocztowego?

Nie wiesz czy jesteś mężczyzną? :/

0

Napisz ze czujesz sie kobietą,nie powinien wyskoczyc błąd- teraz nawet kompilatory są poprawne politycznie.

0

@Fokus Pokus: A jak chciałbyś, żeby to działało?

Na pierwszy rzut oko to wystarczy Ci tylko jeden Scanner zamiast pięciu. Możesz sprawdzać na przykładzie inta tak:

if(scanner.hasNextInt()) {
    rokUrodzenia = scanner.nextInt();
}
0

Teraz mi dziala.

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Osoba {

    String imie, nazwisko;
    int rokUrodzenia;
    boolean plec;
    short kodPocztowy;

    Osoba() throws NiewlasciweDaneException {

        System.out.println("Wprowadz imie");

        Scanner odczyt1 = new Scanner(System.in);
        this.imie = odczyt1.nextLine();


        System.out.println("Wprowadz nazwisko");
        Scanner odczyt2 = new Scanner(System.in);
        this.nazwisko = odczyt2.nextLine();


        System.out.println("Wprowadz rok urodzenia");
        Scanner odczyt3 = new Scanner(System.in);
        String o3 = odczyt3.nextLine();
        Pattern pattern = Pattern.compile("[0-9]{4}");
        Matcher matcher = pattern.matcher(o3);

        while (!matcher.matches()){
            if (matcher.matches()) {
                int a = Integer.parseInt(o3);
                this.rokUrodzenia = a;
            } else {
                throw new NiewlasciweDaneException();
            }
    }
/*

            if (a >= -2147483648 && a <= 2147483647) {
                this.rokUrodzenia = a;
            }else {
                throw new NiewlasciweDaneException();
            }
 */
        System.out.println("Czy jest mezczyzna?");
        Scanner odczyt4 = new Scanner(System.in);
        String o4 = odczyt4.nextLine();
        if (o4.equals("true")) {
            this.plec = true;
        } else if (o4.equals("false")) {
            this.plec = false;
        } else {
            throw new NiewlasciweDaneException();
        }


        System.out.println("Wprowadz kod pocztowy");
        Scanner odczyt5 = new Scanner(System.in);
        String o5 = odczyt5.nextLine();
        Pattern pattern2 = Pattern.compile("[0-9]{0,5}");
        Matcher matcher2 = pattern2.matcher(o5);

        if (matcher2.matches()) {
            int b1=Integer.parseInt(o5);
            short b2;
            if (b1 >= -32768 && b1 <= 32767) {
               b2=(short)b1;
                this.kodPocztowy = b2;
            } else {
                throw new NiewlasciweDaneException();
            }


        }

    }

}

Jak sprawic ze po wykryciu bledu- i wyskoczeniu jego komunikatu-program ponownie poprosil o wpisanie poprawnej danych. Oraz jak sprawic by po wykryciu bledy program nie zatrzymywal sie i lecial dalej? Poza tym jak zrobic to jednym scannerem?

0

Musisz obsłużyć wyjątek blokiem try-catch w pętli.

pętla {
    try {
        // rzucenie wyjątku
    } catch {
        // osługa
    }
}

Co do tego Scannera to pierwszy przykład z brzegu:

int num;
  double num2;
  String name;
  char c;

  Scanner sc = new Scanner(System.in);

  //for integer
  System.out.print("Enter a number: ");
  num = sc.nextInt();
  System.out.printf("%d\n", num);

  //for float
  System.out.print("Enter a float value: ");
  num2 = sc.nextDouble();
  System.out.printf("%.2f\n", num2);

  //for name w/o white space
  System.out.print("Enter your first name: ");
  name = sc.next();
  System.out.printf("Hello %s, welcome to Scanner\n", name);

  //for character
  System.out.print("Enter a character: ");
  c = sc.findWithinHorizon(".", 0).charAt(0);
  System.out.printf("%c\n", c);

  sc.nextLine(); // skip

  //for name w/ white space
  System.out.print("Enter your full name: ");
  name = sc.nextLine();
  System.out.printf("%s", name);

1 użytkowników online, w tym zalogowanych: 0, gości: 1