Java中Scanner类读取用户输入需创建对象并注意换行残留:用Scanner sc = new Scanner(System.in)创建,nextLine()读整行并消耗换行符,nextInt()等不消耗换行符,混合使用时须加sc.nextLine()清理,最后推荐调用sc.close()。

Java中Scanner类是读取用户输入最常用的方式,核心在于创建Scanner对象、调用对应方法读取数据、注意类型匹配与换行残留问题。
创建Scanner对象,关联输入源
通常从标准输入(键盘)读取,需传入System.in:
- Scanner sc = new Scanner(System.in); —— 最常见用法
- 也可读取字符串、文件等:new Scanner("123 abc") 或 new Scanner(new File("data.txt"))
按类型读取数据,方法名即语义
Scanner提供一系列nextXxx()方法,自动跳过空白符(空格、制表、换行),但要注意行为差异:
- nextLine():读取整行(含空格),并消耗掉换行符
- next()、nextInt()、nextDouble()等:只读取下一个“有效标记”(以空白分隔),不消耗后续换行符
- 例如:先调用nextInt()再调用nextLine(),后者会直接返回空字符串——因为换行符还留在缓冲区
避免换行残留,典型修复写法
混合使用数值读取和字符串读取时,必须手动清理换行符:
立即学习“Java免费学习笔记(深入)”;
- 在nextInt()后加一句sc.nextLine();,专门吸收残留换行
- 或者统一用nextLine()读取所有输入,再用Integer.parseInt()等转换
- 示例:
// 安全写法
int age = sc.nextInt();
sc.nextLine(); // 吸收换行
String name = sc.nextLine();
关闭Scanner,释放资源(可选但推荐)
如果Scanner关联的是文件,必须调用sc.close();关联System.in时关闭与否影响不大,但养成习惯更稳妥:
- sc.close(); —— 放在所有读取操作完成后
- 注意:关闭后不可再调用任何nextXxx()方法,否则抛IllegalStateException










