Program pomija dwa warunki w pętli

0

Witam! Poniższa funkcja sprawdza dane, które użytkownik wpisał w polu. Pętla działa, jednak nie wiem dlaczego pomija pierwszy i ostatni warunek tzn jeśli wpiszę co innego niż same liczby, program to wyłapie i wyświetli odpowiedni komunikat, natomiast jeśli wpiszę same liczby program zależnie od tego czy warunek jest pierwszym czy ostatnim w pętli, przejdzie dalej nie sprawdzając długości wpisanego stringa(jeśli warunek jest pierwszy w pętli)lub się po prostu zawiesi(ostatni warunek pętli). Dlaczego tak się dzieje?

    

public String start(){

do{
       String psl;
        psl = PPesel.getText();
    nowy.numer = psl;
        if(nowy.numer.length()>11){
      Komunikat.setBackground(Color.pink);
        Komunikat.setText("Pesel zbyt długi! - musi zawierać dokładnie 11 cyfr!");
        nowy.nr=false; 
        break;
    }
    if(nowy.numer.matches("[0-9]+") == false && nowy.numer.length()==11){
         Komunikat.setBackground(Color.pink);
        Komunikat.setText("PESEL musi zawierać WYŁĄCZNIE cyfry!");
    nowy.nr=false;
    } 
    if(nowy.numer.matches("[0-9]+")==false && nowy.numer.length()<11){
     Komunikat.setBackground(Color.pink);
        Komunikat.setText("PESEL musi zawierać WYŁĄCZNIE cyfry! " 
     + "  PESEL zbyt krótki! - musi zawierać 11 cyfr!");
    
     nowy.nr=false;
        }
    if(nowy.numer.matches("[0-9]+")==false && nowy.numer.length()>11){
     Komunikat.setBackground(Color.pink);
        Komunikat.setText("PESEL musi zawierać WYŁĄCZNIE cyfry! "
    + "  PESEL zbyt długi! - musi zawierać 11 cyfr!");
    nowy.nr=false;
    }

    if(nowy.numer.matches("[0-9]+") == true && nowy.numer.length()<11){
      Komunikat.setBackground(Color.pink);
        Komunikat.setText("Pesel zbyt krótki! - Musi zawierać dokładnie 11 cyfr!");   
    nowy.nr=false;
    } 
    
      else{
        //Komunikat.setText("Podany PESEL to: " +nowy.numer);
        nowy.nr=true;
        break;
    }
    }
    while(nowy.nr==false);
    podziel();
    return nowy.numer;
0

Bo masz do d**y napisane te warunki?

  1. wyciągamy sobie kilka metod sprawdzających do osobnego interfejsu
interface WalidatorPesel{
    void sprawdzDlugosc(String pesel, Set<String> errors);
    void sprawdzCzyCyfry(String pesel, Set<String> errors);
}
  1. Piszemy implementację:
class WalidatorPeselImpl implements WalidatorPesel{
    void sprawdzDlugosc(String pesel, Set<String> errors){
          if(pesel.length()>11)
             errors.add("Pesel za długi");
          if(pesel.length()<11)
             errors.add("Pesel za krótki");
    }
    void sprawdzCzyCyfry(String pesel, Set<String> errors){
          if(!nowy.numer.matches("[0-9]+"))
             errors.add("Pesel może zawierać tylko cyfry");
    }
}
  1. piszemy testy!!! > Testy jednostkowe
  2. używamy jej zamiast iluśtamset linii kodu, do którego zapewne nie napisałeś testów:
public String start(){
 
do{
    nowy.numer = PPesel.getText();
    WalidatorPeselImpl walidator = new WalidatorPeselImpl();
    Set<String> errors = new HashSet<String>();
    walidator.sprawdzDlugosc(nowy.numer, errors);
    walidator.sprawdzCzyCyfry(nowy.numer, errors);
    if(!errors.isEmpty()){
        wyswietlBledy(errors);
        break;
    }
} while(nowy.nr==false);

.

0

Dlaczego w tym sprawdzaniu jest użyta pętla? Użytkownik wpisuje pesel do pola tekstowego i inicjuje sprawdzanie (naciska Enter lub klika w przycisk). Program sprawdza czy to jest poprawny pesel i wypisuje odpowiedni komunikat. Kolejne sprawdzanie (jeśli pesel był błędny) powinno się odbyć dopiero po wpisaniu nowego peselu.

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