Java: Module3 Lesson 5

Scanner.nextLine()

input.nextInt(); 读取整数后,为什么需要紧接着调用 input.nextLine(),为什么需要这个额外的 nextLine()?

问题的根源

在 Java 的 Scanner 中:

  1. nextInt() 读取整数 但不会读取换行符,只读取数值部分。
  2. 用户在输入整数时按下 Enter,这个 Enter 生成的换行符 (\n) 仍然留在输入流中
  3. nextLine() 读取整行字符串,包括换行符 (\n),所以:
    • 如果 nextLine() 直接跟在 nextInt() 之后,它会 先读取这个遗留的换行符,导致 day 变量变成一个空字符串,而不是用户实际输入的星期名称。

如何修正?

方法 1(正确方式):添加 input.nextLine(); 以消费掉 \n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter a Fahrenheit value: ");
int fahrenheit = input.nextInt();
input.nextLine(); // 消耗掉换行符

System.out.print("Enter a day of the week: ");
String day = input.nextLine(); // 现在能正确读取用户输入
double celsius = (5.0 / 9) * (fahrenheit - 32);

System.out.println(day + " Fahrenheit: " + fahrenheit);
System.out.println(day + " Celsius: " + celsius);
input.close();
}

方法 2(用 next() 代替 nextLine()) 如果星期名称是单个单词(比如 Monday),可以用 next()

1
String day = input.next();

但如果用户输入包含空格的字符串,next() 只会读取 monday,而 and 仍留在输入流中。

1
2
3
4
Enter a Fahrenheit values: 89
Enter a day of the week: monday and
monday Fahrenheit: 89
monday Celsius: 31.666666666666668

总结

如果 nextInt() 后面要读取整行字符串,必须用 nextLine() 先吃掉换行符,否则 nextLine() 直接读取换行符,导致 day 变量变成空字符串。

通配符导入和具体类导入

在 Java 中,使用 import java.util.*; 这样的 通配符导入(wildcard import)和使用 具体类导入(fully-qualified import,如 import java.util.ArrayList;)在编译后的 字节码(bytecode) 上是完全相同的。这是因为 Java 的 import 语句仅仅是编译器的辅助工具,不会影响运行时的行为。

  • import只是告诉编译器使用的类的全名,以方便编译器实际导入使用的类
  • 在运行时,Java 通过 类加载器(ClassLoader) 加载类,而不是依赖 import 语句
  • 唯一的区别是 编译时可能会有一点点额外的处理时间,因为编译器需要查找通配符 import 下实际使用的类

Java: Module3 Lesson 5
https://hexwhat.top/2025/03/30/cs1331-1-5/
作者
Wynn
发布于
2025年3月30日
许可协议