0

0

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

霞舞

霞舞

发布时间:2025-10-18 10:02:17

|

927人浏览过

|

来源于php中文网

原创

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 方法:

    BlackBox AI
    BlackBox AI

    AI编程助手,智能对话问答助手

    下载
    • 关键点: 这里创建了新的 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 对象、处理异常等。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

633

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

589

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

172

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

83

2025.08.07

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 53万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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