Scanner调用nextDouble报错,输入1.5/1,5均触发InputMismatchException如何解决?
解决Java Scanner nextDouble()抛出InputMismatchException的问题
问题原因
Scanner的nextDouble()方法依赖当前JVM的**区域设置(Locale)**解析小数格式。如果系统Locale使用的小数分隔符与输入格式不匹配(比如部分欧洲地区默认用逗号做分隔符,而输入了点;或者Locale的分隔符特殊),就会抛出InputMismatchException。
解决方案
方案1:指定Locale统一解析规则
让Scanner使用固定Locale(比如Locale.US,以点作为小数分隔符),确保点格式的小数能被正确解析:
import java.util.Scanner; import java.util.Locale; public class ex1 { public static void main(String[] args) { Scanner scan = new Scanner(System.in).useLocale(Locale.US); double inch; System.out.println("write the distance in inch:"); inch = scan.nextDouble(); System.out.println("the result is " + inch * 2.54 + " cm"); } }
方案2:兼容点和逗号两种输入格式
先读取输入字符串,将逗号替换为点后再转换为double,同时支持两种输入格式:
import java.util.Scanner; public class ex1 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); double inch; System.out.println("write the distance in inch:"); String input = scan.next().replace(',', '.'); inch = Double.parseDouble(input); System.out.println("the result is " + inch * 2.54 + " cm"); } }
方案3:添加异常处理避免程序崩溃
结合Locale指定,加入循环和异常捕获,当输入错误时提示用户重新输入:
import java.util.Scanner; import java.util.Locale; public class ex1 { public static void main(String[] args) { Scanner scan = new Scanner(System.in).useLocale(Locale.US); double inch = 0; boolean validInput = false; System.out.println("write the distance in inch:"); while (!validInput) { try { inch = scan.nextDouble(); validInput = true; } catch (java.util.InputMismatchException e) { System.out.println("输入格式错误,请输入带点的小数(如1.5)"); scan.next(); // 清除错误输入缓存 } } System.out.println("the result is " + inch * 2.54 + " cm"); } }
内容的提问来源于stack exchange,提问作者Kawthariiz
相关产品推荐
相关产品推荐

