Java使用Scanner读取多类型输入持续抛出InputMismatchException问题排查
报错原因定位与修复方案
报错触发的核心原因
你遇到的InputMismatchException是Scanner读取方法和输入格式不匹配导致的,顺着代码走一遍读取流程就能发现明显的位置错位:
- 你提供的测试输入是按顺序排列的16个独立字段值(TVS、Cochin、2000、false……),每个值是独立的分隔符切割单元,不是每个值单独占一整行
- 代码里读取名称、分支用的是
sc.nextLine()方法,这个方法的规则是把从当前光标位置到最近一个换行符的所有内容全部读出来,根本不会按单个字段做拆分 - 第一次循环读取时,第一个
nextLine()会把当前光标到第一个换行的整行内容(本来包含名称、分支、收费、线上服务状态4个相邻字段)全部赋值给变量n,第二个nextLine()会把下一个整行(包含下一组4个字段)全部赋值给变量b - 等代码执行到
c=sc.nextDouble()时,输入缓冲区里剩下的待读内容已经是后面几组的字符串值(比如TCH、Chennai这类非数字内容),完全不符合double类型的解析要求,自然抛出InputMismatchException,这和报错栈指向的nextDouble()代码行是完全对应的。
具体修复步骤
- 统一所有字段的Scanner读取逻辑,不要把按整行读取的
nextLine()和按token读取的nextDouble()/nextBoolean()混用,两类方法对换行符、分隔符的处理逻辑不一致,很容易造成读取位置错位 - 把读取名称、分支的方法从
nextLine()换成next(),这个方法会在遇到分隔符(空格、换行、逗号等)时停止读取,和nextDouble()、nextBoolean()的读取规则完全匹配,不会误吞后续字段的内容 - 删掉代码里夹在
nextDouble()和nextBoolean()之间的多余sc.nextLine()调用,避免不必要的读取位置偏移 - 按照需求把无线上服务时的输出提示替换为要求的“无可用线上服务”,替换掉代码里原来的英文提示
修改后的核心读取循环代码:
for(int i=0;i<4;i++) { n = sc.next(); b = sc.next(); c = sc.nextDouble(); o = sc.nextBoolean(); ab[i] = new Servicecentre(n,b,c,o); }
潜在逻辑优化提示
原来的findavg方法有个判断逻辑漏洞:如果存在支持线上服务的中心,但它的收费恰好是0,计算出的平均值会等于0,代码会误判成“没有可用线上服务”。可以调整判断逻辑,在方法内直接对支持线上服务的计数变量做判断,当计数为0时返回专门的标识值,避免和真实平均收费为0的场景混淆。
内容的提问来源于stack exchange,提问作者HARINI M
相关产品推荐
相关产品推荐

