如何通过Scanner输入double值 解决二次函数代码输入不匹配异常
问题根因
- 核心原因是
Scanner类默认继承当前操作系统的区域设置(Locale),部分地区的本地化规则中小数分隔符为逗号(,)而非英文句号(.),当你输入5.9这类用.作为小数分隔符的数值时,Scanner无法匹配double类型的格式规则,就会抛出InputMismatchException异常。 - 次要排查点:确认输入内容没有额外的空格、特殊字符,且确实是合法的数值格式。
修复方案
直接强制指定Scanner使用英文区域规则,即可支持.作为小数分隔符,修改步骤如下:
- 导入Locale类:在代码开头新增
import java.util.Locale; - 初始化Scanner后调用
useLocale方法设置为美式区域规则:static Scanner scan = new Scanner(System.in).useLocale(Locale.US);
优化后完整代码
import java.util.Locale; import java.util.Scanner; public class Main { // 强制设置Scanner使用英文区域规则,支持.作为小数分隔符 static Scanner scan = new Scanner(System.in).useLocale(Locale.US); public static void main(String[] args) { Wrappers.quadraticWrapper(scan); } static class Wrappers { public static void quadraticWrapper(Scanner s){ System.out.print("Insert for a: "); double a = s.nextDouble(); // 新增二次方程合法校验:a不能为0 if(a == 0) { System.out.println("参数a不能为0,不是二次方程"); return; } System.out.print("insert for b: "); double b = s.nextDouble(); System.out.print("insert for c: "); double c = s.nextDouble(); double discriminant = Math.pow(b, 2) - 4 * a * c; // 新增判别式校验,避免负数开平方得到NaN if(discriminant < 0) { System.out.println("判别式小于0,无实数根"); return; } printArr(Formulas.quadraticF(a, b, c)); } private static void printArr(double[] arr) { System.out.println("["); for (double d : arr) { System.out.print(d + " "); } System.out.println("]"); } } static class Formulas{ public static double[] quadraticF(double a, double b, double c) { double[] arr = new double[2]; double discriminant = Math.sqrt(Math.pow(b, 2) - 4 * a * c); arr[0] = (-b + discriminant)/(2 * a); arr[1] = (-b - discriminant)/(2 * a); return arr; } } }
额外优化说明
- 新增了二次方程合法性校验:避免a为0时出现除以0的异常
- 新增了判别式校验:避免判别式小于0时开平方得到非数字(NaN)的问题
- 重复计算的判别式提取为公共变量,减少重复计算
内容的提问来源于stack exchange,提问作者Mile Stanislavov
相关产品推荐
相关产品推荐

