首页 > Java > java教程 > 正文

Java中方法如何接收多个输入:深入解析Scanner类的使用

霞舞
发布: 2025-10-18 10:02:17
原创
887人浏览过

java中方法如何接收多个输入:深入解析scanner类的使用

本文旨在详细解释Java程序中如何使用Scanner类接收多个用户输入,并通过一个简单的成绩计算示例,剖析输入数据流的运作机制,帮助读者理解Scanner对象在不同方法间的交互,以及如何正确地从标准输入读取数据。

在Java编程中,Scanner 类是用于从各种输入源(例如键盘、文件等)读取数据的关键工具。理解 Scanner 的工作原理,对于编写能够与用户交互的程序至关重要。本文将通过一个成绩计算的示例,深入探讨 Scanner 如何在不同的方法之间传递和处理输入数据。

Scanner 类的工作原理

Scanner 类通过创建一个 Scanner 对象来工作,该对象与特定的输入流相关联。在示例代码中,Scanner sc = new Scanner(System.in); 创建了一个 Scanner 对象 sc,它与标准输入流 System.in (通常是键盘) 相关联。

Scanner 类提供了一系列方法,用于从输入流中读取不同类型的数据,例如 nextLine() 用于读取字符串,nextDouble() 用于读取双精度浮点数,nextInt() 用于读取整数等等。

立即学习Java免费学习笔记(深入)”;

示例代码分析

让我们分析示例代码中的成绩计算程序:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        double avg;
        String[] name = new String[10];

        for (int j = 0; j<10; j++)
        {
            System.out.println("What is the name of the student?");
            name[j] = sc.nextLine();
            System.out.println("What are their test scores?");
            avg = calculateAverage(j);
            System.out.println("Their average is " + avg + ", that is a " + calculateGrade(avg));
        }
    }

    public static double calculateAverage(int j) {
        double [][]gradebook = new double[10][5];
        Scanner sc = new Scanner(System.in); // 注意:这里创建了新的Scanner对象
        double sum = 0;
        for (int v=0; v<5; v++)
        {
            gradebook[j][v] = sc.nextDouble();
            sum = gradebook[j][v] + sum;
        }

        double avg = sum / 5;
        return avg;
    }

    public static String calculateGrade (double avg)
    {
        if (avg >= 90 && avg <= 100) {
            return "A";
        }
        else if (avg >= 80) {
            return "B";
        }
        else if (avg >= 70) {
            return "C";
        }
        else if (avg >= 60) {
            return "D";
        }
        else {
            return "F";
        }
    }
}
登录后复制

代码流程:

  1. main 方法:

    • 创建 Scanner 对象 sc。
    • 循环10次,每次循环:
      • 提示用户输入学生姓名,使用 sc.nextLine() 读取姓名。
      • 调用 calculateAverage(j) 方法计算平均成绩。
      • 调用 calculateGrade(avg) 方法根据平均成绩计算等级。
      • 输出结果。
  2. calculateAverage 方法:

    火山方舟
    火山方舟

    火山引擎一站式大模型服务平台,已接入满血版DeepSeek

    火山方舟 99
    查看详情 火山方舟
    • 关键点: 这里创建了新的 Scanner 对象 sc。
    • 循环5次,每次循环:
      • 提示用户输入成绩,使用 sc.nextDouble() 读取成绩。 每当执行到 sc.nextDouble() 时,程序会暂停,等待用户输入。
      • 将成绩累加到 sum 变量。
    • 计算平均成绩并返回。
  3. calculateGrade 方法:

    • 根据平均成绩返回等级。

理解输入数据流

在 calculateAverage 方法中,sc.nextDouble() 方法负责从标准输入读取一个双精度浮点数。当程序执行到这一行时,它会暂停并等待用户输入。用户可以输入一个数字,然后按下回车键。Scanner 对象会将输入的数字解析为 double 类型,并将其赋值给 gradebook[j][v]。

关键在于,Scanner 对象维护了一个内部的“指针”,指向输入流中下一个要读取的位置。每次调用 nextDouble()、nextLine() 等方法时,Scanner 对象都会从当前位置开始读取数据,并将指针移动到下一个位置。

容易混淆的地方:

代码中在calculateAverage 方法里又创建了一个新的Scanner对象。实际上,更好的做法是在main方法中创建唯一的Scanner对象,然后将其作为参数传递给calculateAverage方法,避免资源浪费和潜在的输入流问题。

修改后的代码示例:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        double avg;
        String[] name = new String[10];

        for (int j = 0; j<10; j++)
        {
            System.out.println("What is the name of the student?");
            name[j] = sc.nextLine();
            System.out.println("What are their test scores?");
            avg = calculateAverage(j, sc); // 将Scanner对象传递给calculateAverage
            System.out.println("Their average is " + avg + ", that is a " + calculateGrade(avg));
        }

        sc.close(); // 记得关闭Scanner对象
    }

    public static double calculateAverage(int j, Scanner sc) { // 接收Scanner对象作为参数
        double [][]gradebook = new double[10][5];
        double sum = 0;
        for (int v=0; v<5; v++)
        {
            gradebook[j][v] = sc.nextDouble();
            sum = gradebook[j][v] + sum;
        }

        double avg = sum / 5;
        return avg;
    }

    public static String calculateGrade (double avg)
    {
        if (avg >= 90 && avg <= 100) {
            return "A";
        }
        else if (avg >= 80) {
            return "B";
        }
        else if (avg >= 70) {
            return "C";
        }
        else if (avg >= 60) {
            return "D";
        }
        else {
            return "F";
        }
    }
}
登录后复制

注意事项:

  • Scanner 对象的关闭: 使用完 Scanner 对象后,应该调用 close() 方法关闭它,释放资源。在上面的修改后的代码中,sc.close() 被添加到 main 方法的末尾。
  • 输入类型匹配: 确保使用正确的方法读取输入数据。例如,如果需要读取整数,应该使用 nextInt() 方法,而不是 nextDouble() 方法。如果输入类型不匹配,可能会抛出 InputMismatchException 异常。
  • 处理异常: 在实际应用中,应该考虑处理可能出现的异常,例如 InputMismatchException。可以使用 try-catch 块来捕获和处理异常。
  • nextLine() 的特殊性: nextLine() 会读取换行符之前的所有内容,包括空格。如果在调用 nextLine() 之前调用了其他 Scanner 方法(例如 nextInt() 或 nextDouble()),可能会导致 nextLine() 读取到一个空字符串。为了避免这种情况,可以在调用 nextLine() 之前先调用 sc.nextLine() 清除换行符。

总结

Scanner 类是 Java 中用于读取用户输入的重要工具。理解 Scanner 的工作原理,特别是它如何维护输入流的“指针”,以及如何在不同的方法之间共享 Scanner 对象,对于编写健壮和高效的 Java 程序至关重要。 通过修改示例代码,我们学习了如何正确地在方法间传递 Scanner 对象,并避免了重复创建 Scanner 对象的问题。同时,我们也强调了在使用 Scanner 类时需要注意的一些事项,例如关闭 Scanner 对象、处理异常等。

以上就是Java中方法如何接收多个输入:深入解析Scanner类的使用的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号