读取用户输入:Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("你的名字:");
String name = sc.nextLine();
System.out.print("你的年龄:");
int age = sc.nextInt();
System.out.println(name + ",明年你 " + (age + 1) + " 岁");
sc.close();
}
}
三个新东西:
import java.util.Scanner; —— 告诉 Java"我要用 Scanner 这个工具"。它不在默认加载的范围里,得先声明。import 语句永远写在文件最上方、class 外面。
new Scanner(System.in) —— 创建一个 Scanner 对象,System.in 表示"数据来源是键盘"。new 是"造一个出来"的意思,第七课细讲。
sc.close() —— 用完关掉。不关不会出错,但是好习惯。
按类型读取
sc.nextInt() // 读一个整数
sc.nextDouble() // 读一个小数
sc.next() // 读一个单词(遇到空格就停)
sc.nextLine() // 读一整行(包括空格)
和 Python 不同,Java 的 Scanner 直接给你想要的类型,不用手动转换。但如果用户输入了 abc 而你调 nextInt(),会抛 InputMismatchException。
一个把所有人坑过一次的坑
int age = sc.nextInt();
String name = sc.nextLine(); // ← 这里读到的是空字符串!
原因:nextInt() 只取走了数字,把你按的那个回车(换行符)留在了缓冲区里。接下来的 nextLine() 一看,"哦,到行尾了",于是返回空字符串就走了。
解决办法是多读一次,把那个回车吃掉:
int age = sc.nextInt();
sc.nextLine(); // 吃掉残留的换行
String name = sc.nextLine(); // 现在正常了
或者干脆全用 nextLine() 读进来,自己转换:
int age = Integer.parseInt(sc.nextLine().trim());
记住这个坑。它不报错,只是行为诡异,新手能查半小时。
类型转换
int n = Integer.parseInt("42"); // 字符串 → int
double d = Double.parseDouble("3.14"); // 字符串 → double
String s = String.valueOf(42); // 数字 → 字符串
String s2 = 42 + ""; // 偷懒写法,也能用
Integer.parseInt("abc") 会抛 NumberFormatException。
格式化输出
double price = 19.987;
System.out.printf("单价 %.2f 元,共 %d 件%n", price, 3);
// 单价 19.99 元,共 3 件
%.2f 是保留两位小数的浮点数,%d 是整数,%s 是字符串,%n 是换行。占位符的个数和顺序必须和后面的参数对上,否则运行时抛异常。
10 秒自测
为什么 nextInt() 之后紧跟 nextLine() 会读到空字符串?
因为 nextInt() 没有消费掉行尾的换行符,nextLine() 读到它就立刻返回了。补一行 sc.nextLine() 吃掉它。