Skip to content

16.4 Scanner 键盘输入

Scanner 类的概念

Scanner 类是 Java 中用于获取用户输入的类,位于 java.util 包中。它可以从各种输入源读取数据,如键盘、文件等。

Scanner 类的使用

创建 Scanner 对象

java
import java.util.Scanner;

// 创建从键盘读取输入的 Scanner 对象
Scanner scanner = new Scanner(System.in);

读取不同类型的输入

读取字符串

java
// 读取一行字符串
String line = scanner.nextLine();

// 读取一个单词(以空格为分隔符)
String word = scanner.next();

读取整数

java
// 读取整数
int num = scanner.nextInt();

// 读取长整数
long longNum = scanner.nextLong();

读取浮点数

java
// 读取浮点数
float floatNum = scanner.nextFloat();

// 读取双精度浮点数
double doubleNum = scanner.nextDouble();

读取布尔值

java
// 读取布尔值(true 或 false)
boolean bool = scanner.nextBoolean();

检查输入

java
// 检查是否有下一个输入
boolean hasNext = scanner.hasNext();

// 检查是否有下一个整数
boolean hasNextInt = scanner.hasNextInt();

// 检查是否有下一个浮点数
boolean hasNextDouble = scanner.hasNextDouble();

关闭 Scanner

java
// 使用完毕后关闭 Scanner
scanner.close();

示例:Scanner 类的应用

示例 1:读取用户输入的字符串

java
import java.util.Scanner;

public class ReadStringExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入你的名字: ");
        String name = scanner.nextLine();
        System.out.println("你好, " + name + "!");
        
        scanner.close();
    }
}

示例 2:读取用户输入的整数

java
import java.util.Scanner;

public class ReadIntExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入一个整数: ");
        int num = scanner.nextInt();
        System.out.println("你输入的整数是: " + num);
        System.out.println("该整数的平方是: " + (num * num));
        
        scanner.close();
    }
}

示例 3:读取多个输入

java
import java.util.Scanner;

public class ReadMultipleInputsExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入你的名字: ");
        String name = scanner.nextLine();
        
        System.out.print("请输入你的年龄: ");
        int age = scanner.nextInt();
        
        System.out.print("请输入你的身高(米): ");
        double height = scanner.nextDouble();
        
        System.out.println("姓名: " + name);
        System.out.println("年龄: " + age);
        System.out.println("身高: " + height + " 米");
        
        scanner.close();
    }
}

示例 4:使用 hasNext 检查输入

java
import java.util.Scanner;

public class CheckInputExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入一个整数: ");
        while (!scanner.hasNextInt()) {
            System.out.println("输入错误,请输入一个整数: ");
            scanner.next(); // 消费无效输入
        }
        int num = scanner.nextInt();
        System.out.println("你输入的整数是: " + num);
        
        scanner.close();
    }
}

示例 5:读取多行输入

java
import java.util.Scanner;

public class ReadMultipleLinesExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("请输入多行文本,输入 'exit' 结束:");
        
        String line;
        while (!(line = scanner.nextLine()).equals("exit")) {
            System.out.println("你输入的是: " + line);
        }
        
        System.out.println("输入结束");
        scanner.close();
    }
}

常见问题

1. nextLine() 跳过输入

症状:使用 nextInt()、nextDouble() 等方法后,nextLine() 跳过了用户输入

解决方案:在 nextInt() 等方法后,使用一个额外的 nextLine() 来消费换行符

示例

java
import java.util.Scanner;

public class NextLineIssueExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入一个整数: ");
        int num = scanner.nextInt();
        
        // 消费换行符
        scanner.nextLine();
        
        System.out.print("请输入一个字符串: ");
        String str = scanner.nextLine();
        
        System.out.println("整数: " + num);
        System.out.println("字符串: " + str);
        
        scanner.close();
    }
}

2. 输入类型不匹配

症状:用户输入的类型与预期不符,导致程序崩溃

解决方案:使用 hasNextXxx() 方法检查输入类型

示例

java
import java.util.Scanner;

public class InputTypeCheckExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("请输入一个整数: ");
        while (!scanner.hasNextInt()) {
            System.out.print("输入错误,请输入一个整数: ");
            scanner.next(); // 消费无效输入
        }
        int num = scanner.nextInt();
        
        System.out.println("你输入的整数是: " + num);
        scanner.close();
    }
}

3. 资源泄漏

症状:Scanner 未关闭,导致资源泄漏

解决方案:使用 try-with-resources 语句自动关闭 Scanner

示例

java
// 错误:未关闭 Scanner
// Scanner scanner = new Scanner(System.in);
// // 使用 scanner

// 正确:使用 try-with-resources
import java.util.Scanner;

public class AutoCloseScannerExample {
    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            System.out.print("请输入你的名字: ");
            String name = scanner.nextLine();
            System.out.println("你好, " + name + "!");
        } // scanner 自动关闭
    }
}

最佳实践

  1. 使用 try-with-resources:自动关闭 Scanner,避免资源泄漏

  2. 检查输入类型:使用 hasNextXxx() 方法检查输入类型,避免输入类型不匹配导致的程序崩溃

  3. 处理换行符问题:在使用 nextInt() 等方法后,使用额外的 nextLine() 来消费换行符

  4. 提供清晰的提示:为用户提供清晰的输入提示,说明需要输入什么类型的数据

  5. 处理无效输入:当用户输入无效时,给出友好的错误提示,并允许用户重新输入

  6. 限制输入长度:对于需要限制长度的输入,进行适当的检查和处理

总结

Scanner 类是 Java 中用于获取用户输入的重要工具类:

  1. 基本用法

    • 创建 Scanner 对象
    • 使用各种 nextXxx() 方法读取不同类型的输入
    • 使用 hasNextXxx() 方法检查输入类型
    • 使用完毕后关闭 Scanner
  2. 常见问题

    • nextLine() 跳过输入
    • 输入类型不匹配
    • 资源泄漏
  3. 最佳实践

    • 使用 try-with-resources 自动关闭 Scanner
    • 检查输入类型
    • 处理换行符问题
    • 提供清晰的提示
    • 处理无效输入

通过合理使用 Scanner 类,可以方便地获取用户输入,实现交互式程序。

© 2026 编程马·菜鸟教程 版权所有