jak wprowadzic alternatywny scenariusz do scannera

jak wprowadzic alternatywny scenariusz do scannera
TE
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:1
0
Kopiuj
Scanner wprowadz = new Scanner(System.in);
System.out.println("Podaj druga liczbe");
b = wprowadz.nextDouble();            

/*jak zrobic alternatywny scenariusz, w ktorym wprowadzona wartosc nie bedzie double'm i ktory zamiast wyswietlac bledu pokaze nam 
System.out.println("Nie wprowadziłeś poprawnej wartości , wprowadź liczbę"); ?

edytowany 1x, ostatnio: Koziołek
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:5 dni
  • Lokalizacja:Kraków
  • Postów:1694
2
PO
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:9
1

W sumie to można także użyć wyjątku InputMismatchExeption. Ale nie gwarantuje, że to jest rozwiązanie optymalne.

Kopiuj
                double input =0;
                Scanner scan = new Scanner(System.in);

                while(true) {
                        try {
                               input= scan.nextDouble();
                               break;

                        } catch( InputMismatchException e){
                                System.out.println(     "Nie wprowadziłeś poprawnej wartości , wprowadź liczbę");
                                scan.next();

                        }
                }
Koziołek
To nie jest rozwiązanie, bo sterujesz przepływem za pomocą wyjątków. Wprowadzenie błędnej wartości nie jest czymś „wyjątkowym”.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:14 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
3

@theED: użycie hasNextXXX jak sugerował @szweszwe, ale w sensowny sposób:

Kopiuj

class MyScaner{
   private InvalidInputHandler iih;
   private Scanner scanner;
   
   public MyScaner(InvalidInputHandler iih, InputStream in){
         this.iih = iih;
         this.scanner = new Scanner(in); 
   }

  public Either<String, Double> next(){
      if(scanner.hasNextDouble()) return Either.right(scanner.nextDouble());
      return iih.handle(scanner::next)
  }
}

//
class InvalidInputHandler{
    public Either<String, Double> handle(Supplier<Double> operation){
         Try.of(operation::get).toEither();
   }
}

Obsługę błędu delegujesz do InvalidInputHandler i niech tam będzie czy to prosty try/catch czy tak jak wyżej użycie Vavr.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.