L'esecuzione del seguente in Eclipse inizialmente causato scanner di non riconoscere ritorni a capo nella console che bloccano efficacemente ulteriore input:comportamento strano con scanner # nextFloat
price = sc.nextFloat();
Aggiungendo questa riga prima del codice provoca scanner ad accettare 0,23 (notazione francese) come float:
Locale.setDefault(Locale.US);
Questo è molto probabilmente a causa di impostazioni internazionali di Windows XP Pro (francese/belga). Quando il codice viene eseguito di nuovo, 0,23 viene ancora accettato e l'immissione di 0,23 provoca il lancio di un numero java.util.InputMismatchException
.
Qualche spiegazione sul perché questo sta accadendo? C'è anche una soluzione alternativa o dovrei semplicemente usare Float#parseFloat
?
Modifica: questo dimostra come si comporta lo Scanner con diverse impostazioni locali (decommentare una delle righe all'inizio).
import java.util.Locale;
import java.util.Scanner;
public class NexFloatTest {
public static void main(String[] args) {
//Locale.setDefault(Locale.US);
//Locale.setDefault(Locale.FRANCE);
// Gives fr_BE on this system
System.out.println(Locale.getDefault());
float price;
String uSDecimal = "0.23";
String frenchDecimal = "0,23";
Scanner sc = new Scanner(uSDecimal);
try{
price = sc.nextFloat();
System.out.println(price);
} catch (java.util.InputMismatchException e){
e.printStackTrace();
}
try{
sc = new Scanner(frenchDecimal);
price = sc.nextFloat();
System.out.println(price);
} catch (java.util.InputMismatchException e){
e.printStackTrace();
}
System.out.println("Switching Scanner to System.in");
try{
sc = new Scanner(System.in);
System.out.println("Enter a float value");
price = sc.nextFloat();
System.out.println(price);
} catch (java.util.InputMismatchException e){
e.printStackTrace();
}
System.out.print("Enter title:");
String title = sc.nextLine(); // This line is skipped
System.out.print(title);
}
}
Edit: questo riproduce il problema in cui lo scanner è in attesa di un valore float, ma non riesce a innescare quando si preme ritorno:
import java.util.Scanner;
public class IgnoreCRTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a float value:");
// On french Locale use , as the decimal separator
float testFloat = sc.nextFloat();
System.out.println(testFloat);
//sc.skip("\n"); // This doesn't solve the issue
sc.nextLine();
System.out.println("Enter an integer value:");
int testInt = sc.nextInt();
System.out.println(testInt);
// Will either block or skip here
System.out.println("Enter a string value :");
String testString = sc.nextLine();
System.out.println(testString);
}
}
Puoi fornire un esempio eseguibile che mostri il sequestro effettivo del codice in esecuzione e che manifesti il problema? –
Sicuro. Aggiungerò del codice in pochi minuti. –