0

0

Java方法输入流详解:多重输入与Scanner类的应用

霞舞

霞舞

发布时间:2025-10-18 10:19:20

|

315人浏览过

|

来源于php中文网

原创

java方法输入流详解:多重输入与scanner类的应用

本文旨在解析Java中方法如何接收多重输入,特别是通过`Scanner`类在循环中读取用户输入并传递给方法的过程。我们将通过一个计算学生平均成绩的示例代码,详细分析`Scanner`对象的作用范围、输入流的读取机制,以及如何在方法中有效地处理用户输入。

在Java编程中,从控制台接收用户输入是常见的需求。Scanner类是Java提供的用于读取各种类型输入的工具。理解Scanner的工作原理,尤其是在方法中处理多重输入,对于编写交互式程序至关重要。

示例代码分析

我们首先分析提供的代码示例,该程序用于计算10个学生的平均成绩。

立即学习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);
        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类用于从输入流中读取数据。在示例中,Scanner sc = new Scanner(System.in);创建了一个Scanner对象,它从标准输入流System.in(通常是键盘)读取数据。

多重输入的处理

在calculateAverage方法中,存在一个Scanner对象,并且通过循环读取5个分数:

public static double calculateAverage(int j) {
    double[][] gradebook = new double[10][5];
    Scanner sc = new Scanner(System.in);
    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;
}

关键在于gradebook[j][v] = sc.nextDouble();这行代码。当程序执行到这行时,它会暂停并等待用户输入一个double类型的值。用户输入一个数字后,程序会将该值赋给gradebook[j][v],然后循环继续执行,再次等待用户输入下一个数字。这个过程重复5次,从而实现了多重输入。

Winston AI
Winston AI

强大的AI内容检测解决方案

下载

为什么不需要在main方法中直接记录输入?

关键点在于System.in是全局唯一的。虽然main方法和calculateAverage方法中都创建了各自的Scanner对象,但它们都指向同一个输入流System.in。因此,在calculateAverage方法中调用sc.nextDouble()时,实际上是从main方法中创建的Scanner对象所指向的输入流中读取数据。 换句话说,输入流是共享的,每个Scanner只是读取它的指针。

优化建议

虽然上述代码可以工作,但存在一些可以改进的地方:

  1. 避免重复创建Scanner对象: 在calculateAverage方法中重复创建Scanner对象是不必要的,并且可能导致资源浪费。更好的做法是在main方法中创建一个Scanner对象,然后将其作为参数传递给calculateAverage方法。

    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); // Pass the scanner object
            System.out.println("Their average is " + avg + ", that is a " + calculateGrade(avg));
        }
        sc.close(); // Close the scanner in main method
    }
    
    public static double calculateAverage(int j, Scanner sc) { // Accept scanner as parameter
        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;
    }
  2. 关闭Scanner对象: 使用完Scanner对象后,应该调用close()方法关闭它,以释放资源。最好在不再需要使用Scanner对象的main方法中执行此操作。

  3. 输入验证: 在实际应用中,应该对用户输入进行验证,以确保输入的是有效的数字。可以使用hasNextDouble()方法检查输入流中是否有下一个double类型的值。

总结

Java的Scanner类提供了方便的输入读取功能。理解Scanner对象的工作原理,以及如何在方法中处理多重输入,是编写交互式Java程序的基础。通过合理的代码组织和资源管理,可以编写出更高效、更健壮的程序。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c++怎么把double转成int
c++怎么把double转成int

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

335

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

70

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

109

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

326

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

62

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

105

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

108

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

236

2026.03.05

热门下载

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

精品课程

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

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.4万人学习

Java 教程
Java 教程

共578课时 | 82.7万人学习

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

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