Java数组输入场景下可正常读取成绩但姓名接收被跳过问题
Scanner读取姓名环节被跳过的问题说明
核心成因
Scanner.nextInt() 的读取逻辑仅匹配、读取输入流中的整数段,不会消费整数输入后伴随的换行符——也就是你输完成绩按下回车产生的\n会一直残留在输入缓冲区中。
后续调用sc.nextLine()时,这个残留的换行符会被直接识别为一行输入的结束,程序不会等待用户输入姓名,直接把空字符串存入姓名数组,表现就是姓名输入环节被直接跳过。
对应修复方式
- 方式一:读取成绩后主动清空残留换行
在nextInt()读取完成绩之后,额外调用一次空的nextLine()把缓冲区里的残留换行符消耗掉,再正式读取姓名:System.out.println("position mrks" + i); num[i] = sc.nextInt(); // 消耗nextInt()遗留的换行符 sc.nextLine(); System.out.println("position name " + i); a[i] = sc.nextLine(); - 方式二:统一使用nextLine()读取所有输入
全程用nextLine()读取整行内容,再把成绩对应的文本手动转为整数,从根源上规避不同读取方法的缓冲区兼容问题:System.out.println("position mrks" + i); num[i] = Integer.parseInt(sc.nextLine()); System.out.println("position name " + i); a[i] = sc.nextLine(); - 方式三:使用next()读取单段无空格的姓名
如果输入的姓名本身不含空格,可以直接用next()方法读取内容,该方法会自动跳过所有前置的换行、空白分隔符,直接读取直到下一个分隔符出现的文本内容,无需额外处理残留换行:System.out.println("position mrks" + i); num[i] = sc.nextInt(); System.out.println("position name " + i); a[i] = sc.next();
内容的提问来源于stack exchange,提问作者InAlO
相关产品推荐
相关产品推荐

