Java程序中如何正确复用Scanner实例读取多行命令行输入

发布时间 - 2026-01-27 00:00:00    点击率:

当通过重定向方式(如java main output.txt)向java程序传入多行输入时,必须复用同一个scanner实例,否则重复创建scanner会导致第二次读取时抛出nosuchelementexception异常。

在Java中,System.in是一个字节流(InputStream),其底层缓冲区在被Scanner封装后会按需读取并消费数据。关键点在于:每个Scanner实例都会独立维护对System.in的读取状态。当你在main()中创建一个Scanner input = new Scanner(System.in),它开始从标准输入流读取第一个整数;而紧接着在read()方法中再次执行new Scanner(System.in),会创建一个全新的Scanner——但此时System.in的内部指针已推进到第二行起始位置(或更后),且前一个Scanner可能已缓冲/消耗部分数据,导致新Scanner无法可靠定位,最终在调用nextInt()时因无有效token而抛出NoSuchElementException。

✅ 正确做法是将Scanner实例作为参数显式传递,确保所有读取操作共享同一数据源和读取状态:

import java.util.Scanner;

class Main {
    public static int read(Scanner input) {
        int num2 = input.nextInt();
        System.out.println(num2);
        return num2;
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int num1 = input.nextInt();
        System.out.println(num1);
        read(input); // 复用同一Scanner实例
    }
}

? 注意事项:

  • 不要在多个方法中各自new Scanner(System.in)——这是常见陷阱;
  • 若需在深层调用链中读取,始终以参数形式传递Scanner,避免静态Scanner(易引发线程安全与资源泄漏问题);
  • 使用完毕后,可在main末尾调用input.close()释放资源(尤其在处理大文件时);
  • 对于更健壮的输入处理,建议配合hasNextInt()进行前置校验,避免运行时异常。

该方案简洁、可维护,并完全兼容输入重定向、管道及交互式输入场景。


# java  # 字节  # ai  # stream  # 封装  # Token  # 指针  # 线程  # input  # 创建一个  # 抛出  # 复用  # 重定向  # 这是  # 第一个  # 多个  # 你在  # 可在  # 一个字 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  js实现点击每个li节点,都弹出其文本值及修改  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel用户密码怎么加密_Laravel Hash门面使用教程  如何在新浪SAE免费搭建个人博客?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Laravel如何配置和使用缓存?(Redis代码示例)  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在Tomcat中配置并部署网站项目?  奇安信“盘古石”团队突破 iOS 26.1 提权  北京的网站制作公司有哪些,哪个视频网站最好?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Android滚轮选择时间控件使用详解  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  iOS发送验证码倒计时应用  Python结构化数据采集_字段抽取解析【教程】  Linux网络带宽限制_tc配置实践解析【教程】  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  iOS UIView常见属性方法小结  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  EditPlus中的正则表达式实战(6)  微信小程序 scroll-view组件实现列表页实例代码  如何用腾讯建站主机快速创建免费网站?  javascript日期怎么处理_如何格式化输出  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  高防服务器如何保障网站安全无虞?  js代码实现下拉菜单【推荐】  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  ,网页ppt怎么弄成自己的ppt?  javascript中闭包概念与用法深入理解  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Android仿QQ列表左滑删除操作  如何快速生成凡客建站的专业级图册?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何处理CORS跨域请求?(配置示例)