Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Metodo nextDouble() di Scanner

    Salve, ho notato una stranezza nel metodo nextDouble() della classe Scanner. In sostanza se immetto un valore non puramente numerico ma composto da un numero e una stringa, non viene lanciata in modo normale InputMismatchException...
    Allego esempio al volo.
    codice:
    import java.util.*;
    
    
    public class ProvaDouble {
        
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            System.out.print("Inserisci prezzo: ");
            double prezzo = 0;
            boolean ripeti = true;
            
            do {
                    
                try {
                    prezzo = input.nextDouble();
                    
                    if (prezzo > 0.0) {
                        ripeti = false;
                    }
                    
                }                    
                catch (InputMismatchException e) {
                    System.out.print("Inserimento non valido, reinseriscilo: ");
                }
            
            } while(ripeti);
            
            System.out.println("Il prezzo e' " + prezzo);    
        }
        
    }
    Se immetto 4,90 euro, mi stampa 4,9; se immetto 4,90euro, mi lancia l'eccezione ma va in loop ignorando il nextDouble() presente nel try...

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Scanner usa dei delimitatori. Quello standard è lo spazio.
    Di conseguenza, l'input "4,90 euro" funziona perchè nextDouble si ferma al primo spazio e riesce a parsare l'input correttamente. Attenzione: la stringa "euro" rimane lì nel buffer e un eventuale successivo nextDouble() andrà in eccezione.
    La stringa "4,90euro" invece non rappresenta un valore numerico, quindi viene lanciata l'eccezione. In questo caso devi provvedere tu a pulire l'input, altrimenti la stringa "sporca" rimane nel buffer e al prossimo tentativo, nextDouble() proverà a leggerla di nuovo andando di nuovo in eccezione.

    Dopo aver ottenuto un'eccezione, fai una nextLine() a vuoto in modo da leggere la stringa sporca e pulire il buffer.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Avevo notato che con nextLine() prevengo l'eccezione, ma io ho necessità che se immetto qualcosa dopo lo spazio lanci la InputMismatchException, insomma equiparare gli effetti con e senza spazio. Proverò con un trim().
    Grazie.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Con il trim() vai a rimuovere gli spazi prima e dopo la stringa, non certo quelli al suo interno.
    Puoi agire in due modi:

    1) Rimuovendo gli spazi dalla stringa con replaceAll()
    2) Modificando il delimiter di Scanner con useDelimiter()
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.