Java Scanner完全指南:让程序与用户对话

在Java编程中,Scanner就像程序的"耳朵",让程序能够听到用户的声音,实现真正的交互式程序。今天,我们学习这个让Java程序"活"起来的关键工具。

一、Scanner基础:创建与使用

1.1 导入和创建Scanner

java 复制代码
import java.util.Scanner;  // 第一步:导入

public class ScannerBasic {
    public static void main(String[] args) {
        // 第二步:创建Scanner对象
        Scanner scanner = new Scanner(System.in);
        
        // 第三步:使用Scanner
        System.out.print("请输入你的名字:");
        String name = scanner.nextLine();
        System.out.println("你好," + name + "!");
        
        // 第四步:关闭Scanner(重要!)
        scanner.close();
    }
}

1.2 读取不同类型的数据

java 复制代码
import java.util.Scanner;

public class ReadDifferentTypes {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取整数
        System.out.print("请输入年龄:");
        int age = scanner.nextInt();
        
        // 读取小数
        System.out.print("请输入身高(米):");
        double height = scanner.nextDouble();
        
        // 读取字符串
        scanner.nextLine();  // 重要:先清空缓冲区
        System.out.print("请输入城市:");
        String city = scanner.nextLine();
        
        System.out.println("年龄:" + age);
        System.out.println("身高:" + height);
        System.out.println("城市:" + city);
        
        scanner.close();
    }
}

二、最重要的两个方法:next() vs nextLine()

2.1 关键区别示例

java 复制代码
import java.util.Scanner;

public class NextVsNextLine {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // ❌ 错误示例
        System.out.print("请输入年龄:");
        int age = scanner.nextInt();
        
        System.out.print("请输入姓名:");
        String name = scanner.nextLine();  // 这里会出问题!
        System.out.println("你好," + name);
        
        // ✅ 正确做法
        System.out.print("\n请重新输入年龄:");
        int age2 = scanner.nextInt();
        scanner.nextLine();  // 关键:清空缓冲区
        
        System.out.print("请重新输入姓名:");
        String name2 = scanner.nextLine();
        System.out.println("这次对了,你好," + name2);
        
        scanner.close();
    }
}

2.2 记忆技巧

  • next() :读取一个"单词"(遇到空格就停止)
  • nextLine() :读取整行(包括空格)
  • 重要 :使用nextInt()、nextDouble()等后,要用scanner.nextLine()清空缓冲区

三、实战应用:学生成绩计算器

java 复制代码
import java.util.Scanner;

public class StudentGradeCalculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("=== 学生成绩计算器 ===\n");
        
        // 输入学生信息
        System.out.print("请输入学生姓名:");
        String name = scanner.nextLine();
        
        System.out.print("请输入语文成绩:");
        int chinese = scanner.nextInt();
        
        System.out.print("请输入数学成绩:");
        int math = scanner.nextInt();
        
        System.out.print("请输入英语成绩:");
        int english = scanner.nextInt();
        
        scanner.nextLine();  // 清空缓冲区
        
        // 计算
        int total = chinese + math + english;
        double average = total / 3.0;
        
        // 输出结果
        System.out.println("\n=== 成绩报告 ===");
        System.out.println("姓名:" + name);
        System.out.println("总分:" + total);
        System.out.printf("平均分:%.2f\n", average);
        
        // 判断等级
        if (average >= 90) {
            System.out.println("等级:优秀");
        } else if (average >= 80) {
            System.out.println("等级:良好");
        } else if (average >= 60) {
            System.out.println("等级:及格");
        } else {
            System.out.println("等级:不及格");
        }
        
        scanner.close();
    }
}

四、错误处理和输入验证

java 复制代码
import java.util.Scanner;

public class InputValidation {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 验证年龄输入(必须是1-100之间的整数)
        int age = 0;
        boolean valid = false;
        
        while (!valid) {
            System.out.print("请输入年龄(1-100):");
            
            if (scanner.hasNextInt()) {
                age = scanner.nextInt();
                if (age >= 1 && age <= 100) {
                    valid = true;
                } else {
                    System.out.println("错误:年龄必须在1-100之间!");
                }
            } else {
                System.out.println("错误:请输入整数!");
                scanner.next();  // 清除错误的输入
            }
        }
        
        scanner.nextLine();  // 清空缓冲区
        System.out.println("年龄验证通过:" + age);
        
        scanner.close();
    }
}

五、最重要知识点总结

1. 核心三步骤

java 复制代码
// 1. 导入
import java.util.Scanner;

// 2. 创建
Scanner scanner = new Scanner(System.in);

// 3. 使用
String input = scanner.nextLine();

// 4. 关闭(不要忘!)
scanner.close();

2. 黄金法则

  • 混合使用nextXXX()和nextLine()时 :先用scanner.nextLine()清空缓冲区
  • 输入验证 :用hasNextInt()hasNextDouble()检查输入类型
  • 关闭Scanner:用完一定要关闭,释放资源

3. 一句话记住

Scanner是Java程序的"麦克风"------nextXXX()接收用户输入,nextLine()清空缓冲区,记得用完要关闭!

相关推荐
小毅&Nora6 分钟前
【Java线程安全实战】⑨ CompletableFuture的高级用法:从基础到高阶,结合虚拟线程
java·线程安全·虚拟线程
冰冰菜的扣jio6 分钟前
Redis缓存中三大问题——穿透、击穿、雪崩
java·redis·缓存
小璐猪头18 分钟前
专为 Spring Boot 设计的 Elasticsearch 日志收集 Starter
java
ps酷教程39 分钟前
HttpPostRequestDecoder源码浅析
java·http·netty
闲人编程39 分钟前
消息通知系统实现:构建高可用、可扩展的企业级通知服务
java·服务器·网络·python·消息队列·异步处理·分发器
栈与堆1 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
OC溥哥9991 小时前
Paper MinecraftV3.0重大更新(下界更新)我的世界C++2D版本隆重推出,拷贝即玩!
java·c++·算法
星火开发设计1 小时前
C++ map 全面解析与实战指南
java·数据结构·c++·学习·算法·map·知识
*才华有限公司*1 小时前
RTSP视频流播放系统
java·git·websocket·网络协议·信息与通信
gelald2 小时前
ReentrantLock 学习笔记
java·后端