第 3 课 / 共 9 课14 分钟1 个闯关

Scanner 输入与格式化输出

那个把所有人都坑过一次的 nextInt + nextLine 换行残留。

读取用户输入: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() 吃掉它。

广告位(未配置 AdSense,上线后在此展示)

动手闯关

读懂了不算会,写出来才算

0/1 已通过

闯关和判题完全免费,交错了不扣任何东西。卡住随时点「问 AI」,它能看到你正在写的代码。

关卡 01选择+10 点 · +15 XP

为什么 nextLine 读到了空字符串

```java int age = sc.nextInt(); String name = sc.nextLine(); // name 是空的 ``` 原因是?

  • 可能是多选,选错不扣点数,随便试。
登录后闯关拿点数

学完了?标记一下

标记完成会记进度、涨 20 XP,还会点亮连续学习天数。