当前位置: 首页 > news >正文

【基础语法】Java Scanner hasNext() 和 hasNextLine() 的区别

OJ在线编程常见输入输出练习中默认模板

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处理多个 caseint a = in.nextInt();int b = in.nextInt();System.out.println(a + b);}}
}

API源码解析

JDK 8

Java.util.Scanner Structure
Java.util.Scanner 类结构

hasNext

功能:判断是否还有下一个值,通过检查缓冲区数据和标记(token)实现。

关键方法:

  1. 循环检查输入:使用一个while循环来不断检查输入源是否关闭(sourceClosed变量)。在循环内部:

    • 如果当前缓冲区中有可用的标记(通过hasTokenInBuffer()方法检查),则通过revertState(true)恢复状态并返回true
    • 如果没有可用的标记,则调用readInput()方法从输入源中读取更多的输入到缓冲区中。
  2. 处理循环结束后的状态:如果循环因为sourceClosedtrue而结束(即输入源已经关闭),则再次检查缓冲区中是否有可用的标记。

Note:有三种重载。

    /*** Returns true if this scanner has another token in its input.* This method may block while waiting for input to scan.* The scanner does not advance past any input.** @return true if and only if this scanner has another token* @throws IllegalStateException if this scanner is closed* @see java.util.Iterator*/public boolean hasNext() {ensureOpen();saveState();while (!sourceClosed) {    //sourceClosed 跟踪输入源是否已经关闭if (hasTokenInBuffer())return revertState(true);readInput();}boolean result = hasTokenInBuffer();return revertState(result);}/*** Returns true if the next complete token matches the specified pattern.* A complete token is prefixed and postfixed by input that matches* the delimiter pattern. This method may block while waiting for input.* The scanner does not advance past any input.** @param pattern the pattern to scan for* @return true if and only if this scanner has another token matching*         the specified pattern* @throws IllegalStateException if this scanner is closed*/public boolean hasNext(Pattern pattern) {ensureOpen();if (pattern == null)throw new NullPointerException();hasNextPattern = null;saveState();while (true) {if (getCompleteTokenInBuffer(pattern) != null) {matchValid = true;cacheResult();return revertState(true);}if (needInput)readInput();elsereturn revertState(false);}}/*** Returns true if the next token matches the pattern constructed from the* specified string. The scanner does not advance past any input.** <p> An invocation of this method of the form <tt>hasNext(pattern)</tt>* behaves in exactly the same way as the invocation* <tt>hasNext(Pattern.compile(pattern))</tt>.** @param pattern a string specifying the pattern to scan* @return true if and only if this scanner has another token matching*         the specified pattern* @throws IllegalStateException if this scanner is closed*/public boolean hasNext(String pattern)  {return hasNext(patternCache.forName(pattern));}

hasNextLine

功能:判断是否还有下一行。利用正则表达式匹配来查找行分隔符,并根据查找结果决定是否返回true。

方法实现:

  1. 保存当前状态:通过saveState()方法保存当前扫描器的状态,以便在方法结束时可以恢复到这个状态。这是为了确保方法调用前后扫描器的状态不变。

  2. 查找下一行:使用findWithinHorizon(linePattern(), 0)方法尝试在输入中查找符合行模式的字符串。这里linePattern()返回用于匹配行模式的正则表达式,0表示没有超时限制。

  3. 处理匹配结果

    • 如果找到了匹配项(即result不为null),则进一步处理:
      • 通过this.match()获取匹配结果(MatchResult)。
      • 提取出匹配到的行分隔符(lineSep)。
      • 如果存在行分隔符,则从结果中去除行分隔符部分,并缓存处理后的结果。
      • 如果不存在行分隔符,则直接缓存结果(此时可能是读取到了输入的末尾,但没有明确的行分隔符)。
    • 如果没有找到匹配项,则不缓存任何结果。
  4. 恢复之前的状态:通过revertState()方法恢复扫描器到调用saveState()时的状态。

  5. 返回结果:如果找到了下一行的匹配项(即result不为null),则返回true;否则返回false

Note:只有一种类型的接口,无参。

    /*** Returns true if there is another line in the input of this scanner.* This method may block while waiting for input. The scanner does not* advance past any input.** @return true if and only if this scanner has another line of input* @throws IllegalStateException if this scanner is closed*/public boolean hasNextLine() {saveState();String result = findWithinHorizon(linePattern(), 0);if (result != null) {MatchResult mr = this.match();String lineSep = mr.group(1);if (lineSep != null) {result = result.substring(0, result.length() -lineSep.length());cacheResult(result);} else {cacheResult();}}revertState();return (result != null);}

结论用法

采用 hasXxxx 判断时,后面读取输入也要使用匹配的 nextXxxx 。

比如先用 hasNextLine 对控制台输入判断时,那么后续需要使用 nextLine 来处理输入。

  • hasNext 
  • hasNextXxxx 判断下一个xxx类型
  • hasNextLine 判断是否有下一行

关于 token 说明

上面有提到判断场景的token标记,那么这是什么概念和实际作用呢?

下一个标记可以先粗略理解为下一个数据(但数据类型未知)。

在Java的Scanner类中,术语“标记”(token)通常指的是输入流中可以被识别并作为一个单元处理的字符串或字符序列Scanner类使用分隔符(如空格、制表符、换行符等)来区分不同的标记。例如,当你使用Scanner从控制台读取输入时,你可以通过空格、逗号或其他分隔符来分隔不同的标记。

Scanner 的使用案例

在Java输入控制台(即标准输入流,通常是键盘输入)中,Scanner类通过以下方式实现标记的识别:

1、创建Scanner对象:new并将其与标准输入流System.in关联起来。

Scanner scanner = new Scanner(System.in);

2、设置分隔符(可选):默认情况下,Scanner使用空白(空格、制表符、换行符等)作为分隔符。但是,你可以通过调用useDelimiter(String pattern)方法来设置自定义的分隔符。

例如:逗号分隔标记

scanner.useDelimiter(",");

注意:设置分隔符会影响Scanner识别标记的方式。

3、读取标记:一旦Scanner对象被创建并配置了分隔符,你就可以使用next()nextInt()nextDouble()等方法来读取下一个标记了这些方法会返回输入流中下一个与指定类型匹配的标记。例如:

String token = scanner.next(); // 读取下一个标记作为字符串  
int number = scanner.nextInt(); // 读取下一个标记并尝试将其解析为整数

4、检查是否有下一个标记:在读取标记之前,建议使用hasNext()hasNextLine()方法先检查输入流中是否还有下一个标记或行。这些方法会返回一个布尔值,指示是否还有更多的输入可供读取。例如: 

if (scanner.hasNext()) {  String token = scanner.next();  // 处理标记  
}

5、关闭Scanner对象:完成输入操作后,应该关闭Scanner对象以释放资源。可以通过调用close()方法来实现:(虽然大部分时间没关闭也不会像数据库那样报错)。

scanner.close();

相关文章:

【基础语法】Java Scanner hasNext() 和 hasNextLine() 的区别

OJ在线编程常见输入输出练习中默认模板 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.…...

react使用Fullcalendar 实战用法

使用步骤请参考&#xff1a;react使用Fullcalendar 卡片式的日历&#xff1a; 需求图&#xff1a; 卡片式的日历&#xff0c;其实我是推荐 antd的&#xff0c;我两个都写了一下都能实现。 antd 的代码&#xff1a; antd的我直接用的官网示例&#xff1a;antd 日历示例 i…...

优秀项目经理必知的10款项目管理软件推荐

本文精心为项目经理推荐30款国内外免费的项目管理软件&#xff0c;涵盖桌面应用与Web平台&#xff0c;其中不乏优秀的开源软件。这些工具旨在助力项目经理高效规划、跟踪与控制项目&#xff0c;无论是通过甘特图进行可视化管理&#xff0c;还是利用任务分配、团队协作等功能&am…...

植物神经紊乱不用怕,这些维生素来帮你!

你是否经常感到身体疲惫、情绪波动大、心悸、胸闷&#xff1f;这可能是植物神经紊乱在作祟。别担心&#xff0c;通过合理的维生素补充&#xff0c;可以有效缓解症状&#xff0c;提升生活质量。今天&#xff0c;我们就来聊聊植物神经紊乱患者应该补充哪些维生素。 &#x1f50d…...

NRF52832学习笔记(41)——添加串口库libuarte

一、背景 由于板子上不支持硬件流控&#xff0c;在使用 app_uart_fifo 库接收串口大数据时&#xff0c;频繁报 APP_UART_COMMUNICATION_ERROR 错误&#xff0c;多次重新初始化后&#xff0c;串口也不再产生中断了。查看官方论坛后决定使用串口异步库 libuarte。 二、简介 Li…...

Moore Perf System 1.1版本

Moore Perf System&#xff08;一款性能分析工具&#xff09; 提供可视化界面&#xff0c;在时间轴上按时间顺序显示 CPU 和 GPU 的事件、吞吐和性能指标&#xff0c;帮助开发人员方便、快速、准确的定位到系统级别的性能瓶颈&#xff0c;进而进行针对性分析和优化&#xff0c;…...

SpringBoot+Shirp的权限管理

目录 怎么实现动态菜单 1.html页面 2.获取动态菜单 Shiro权限刷新 1. 配置Shiro 2. 创建权限刷新服务 3. 调用权限刷新服务 注意事项 如何更新ShiroFilter初始权限 怎么实现动态菜单 1.html页面 <ul class"nav side-menu"><!--第一重循环&#xf…...

OpenCV图像基础

目录 显示窗口 创建空白图像 保存图片 图像裁剪 调整图片大小 图像绘制 绘制圆形 绘制矩形 绘制直线 绘制文本 中文乱码 控制鼠标 视频处理 显示窗口 cv2.namedWindow(winname, flagsNone) 创建一个命名窗口&#xff0c;以便在该窗口中显示图像或进行其他图形操作…...

基于MATLAB的图像拼接技术

实验名称&#xff1a;基于MATLAB的图像拼接技术实验目的&#xff1a;利用图像拼接技术得到超宽视角的图像&#xff0c;用来虚拟实际场景。实验原理&#xff1a; 基于相位相关的图像拼接技术是一种基于频域的方法&#xff0c;通过求得图像在频域上是相位相关特点来找到特征位置…...

ComfyUI 快速入门(环境搭建)

ComfyUI 是一个现代化、灵活的用户界面&#xff08;UI&#xff09;工具&#xff0c;专为 AI 模型和深度学习框架设计&#xff0c;能够快速实现可视化操作和定制化界面。在本教程中&#xff0c;我们将介绍如何在本地机器上快速搭建 ComfyUI 环境&#xff0c;帮助你开始使用这一工…...

将HTML项目上传至Gitee仓库(详细教程)

1.登录giett giett地址链接:Gitee - 基于 Git 的代码托管和研发协作平台 2.新建一个giett仓库 创建后得到远程仓库&#xff1a; 3、在本地项目文件夹右击鼠标点击 Open Git Bash Here 4、输入命令 命令:git init&#xff0c;这个目录变成git可以管理的仓库&#xff0c;会出…...

如何应对Oracle SQL语句的数据去重问题,应该考虑哪几个方面?

引言 在数据管理和数据库设计中,数据去重是一个重要的课题。随着信息技术的快速发展,数据的产生速度和数量都在急剧增加,如何有效地管理和维护这些数据成为了一个亟待解决的问题。 数据去重不仅可以减少存储空间的占用,还可以提高数据查询的效率,确保数据的准确性和一致…...

论负载均衡技术在Web系统中的应用论文

一、概要叙述软件项目及其主要工作 在2023年&#xff0c;我有幸参与了某公司电子商务平台的研发项目&#xff0c;担任系统架构设计师一职。该项目旨在构建一个高性能、高可用性的电子商务平台&#xff0c;以支撑公司日益增长的在线业务需求。作为系统架构设计的核心成员&#…...

NumPy 数据类型

1.常用 NumPy 基本类型 &#xff08;1&#xff09;bool_&#xff1a;布尔型数据类型&#xff08;True 或者 False&#xff09; &#xff08;2&#xff09;int_&#xff1a;默认的整数类型&#xff08;类似C 语言long&#xff0c;int32 或 int64&#xff09; &#xff08;3&a…...

JavaScript——(4)

【DOM】 一、DOM基本概念 DOM&#xff08;Document Object Model&#xff0c;文档对象模型&#xff09;是 JavaScript 操作 HTML 文档的接口&#xff0c;使文档操作变得非常优雅、简便。 DOM 最大的特点就是将 HTML 文档表示为 “节点树”。 DOM 元素/节点&#xff1a;就是…...

每日一练 | DHCP Relay(DHCP 中继)

01 真题题目 DHCP Relay 又称为 DHCP 中继&#xff0c;下列关于 DHCP Relay 的说法正确的是&#xff08;多选&#xff09;&#xff1a; A. DHCP 协议多采用广播报文&#xff0c;如果出现多个子网则无法穿越&#xff0c;所以需要 DHCP Relay 设备。 B. DHCP Relay 一定是一台交…...

`psdparse`:解锁Photoshop PSD文件的Python密钥

文章目录 psdparse&#xff1a;解锁Photoshop PSD文件的Python密钥背景&#xff1a;为何选择psdparse&#xff1f;psdparse是什么&#xff1f;如何安装psdparse&#xff1f;简单函数使用方法应用场景常见Bug及解决方案总结 psdparse&#xff1a;解锁Photoshop PSD文件的Python密…...

考研要求掌握的C语言程度(插入排序)

插入排序是啥类型的排序 插入类型的 插入排序经常用在啥类型场景下 用在有序序列下的基础上插入新数据 时间复杂度分析 如果是有序的基础下&#xff0c;最好的时间复杂度是O&#xff08;n&#xff09;; 普通情况下是O&#xff08;n^2&#xff09; 插入排序的原理是啥&am…...

mybatis源码解析-sql执行流程

1 执行器的创建 1. SimpleExecutor 描述&#xff1a;最基本的执行器&#xff0c;每次查询都会创建新的语句对象&#xff0c;并且不会缓存任何结果。 特点&#xff1a; 每次查询都会创建新的 PreparedStatement 对象。 不支持一级缓存。 适用于简单的查询操作&#xff0c;不…...

Golang | Leetcode Golang题解之第538题把二叉搜索树转换为累加树

题目&#xff1a; 题解&#xff1a; func getSuccessor(node *TreeNode) *TreeNode {succ : node.Rightfor succ.Left ! nil && succ.Left ! node {succ succ.Left}return succ }func convertBST(root *TreeNode) *TreeNode {sum : 0node : rootfor node ! nil {if n…...

ED-最优设计实战:如何用Python实现鲁棒实验设计(附完整代码)

ED-最优设计实战&#xff1a;如何用Python实现鲁棒实验设计&#xff08;附完整代码&#xff09; 在数据科学和工程领域&#xff0c;实验设计是优化参数估计和模型性能的关键环节。传统D-最优设计虽然经典&#xff0c;但在面对参数不确定性时往往表现不佳。本文将带你深入理解ED…...

Local SDXL-Turbo保姆级教程:导出为ONNX格式进一步优化推理速度

Local SDXL-Turbo保姆级教程&#xff1a;导出为ONNX格式进一步优化推理速度 1. 引言&#xff1a;为什么需要导出ONNX&#xff1f; 如果你已经体验过Local SDXL-Turbo那“打字即出图”的畅快感&#xff0c;可能会想&#xff1a;这速度已经很快了&#xff0c;还能不能再快一点&…...

遥感小白别慌!ENVI 5.6 基础操作保姆级教程:从打开文件到剖面图显示,一篇搞定

遥感新手实战指南&#xff1a;ENVI 5.6 从零到剖面分析的完整工作流 第一次打开ENVI时&#xff0c;那个布满英文按钮的界面和密密麻麻的菜单栏&#xff0c;是不是让你瞬间想起了大学时被专业课支配的恐惧&#xff1f;别担心&#xff0c;三年前的我也是这样——面对一幅Landsat…...

在ESP32上为LVGL 8.x添加中文输入法:从拼音到候选词显示的完整实现

在ESP32上为LVGL 8.x实现高性能中文输入法的工程实践 当我们在智能家居控制面板上输入Wi-Fi密码时&#xff0c;或者在工业HMI设备中输入参数时&#xff0c;中文输入往往成为嵌入式设备最令人头疼的用户体验瓶颈。ESP32作为物联网领域的主流芯片&#xff0c;其有限的RAM资源&…...

当 Go 还在追求极简时,C++ 26 却又加了四大“史诗级”新特性

大家好&#xff0c;我是Tony Bai。在这个 Go、Zig 等“小而美”新语言颇受青睐的时代&#xff0c;如果你去技术社区里问一句&#xff1a;“C 这门语言怎么样&#xff1f;”你大概率会得到一堆充满戏谑的回答&#xff1a;“太复杂了&#xff0c;别学”、“从入门到放弃”、“面试…...

Qwen3-0.6B-FP8与STM32开发联动:生成嵌入式系统控制逻辑伪代码

Qwen3-0.6B-FP8与STM32开发联动&#xff1a;生成嵌入式系统控制逻辑伪代码 1. 引言 如果你是一位嵌入式开发者&#xff0c;或者正在学习STM32&#xff0c;下面这个场景你一定不陌生&#xff1a;拿到一个传感器模块&#xff0c;比如温湿度传感器&#xff0c;想用它来控制一个风…...

鸣鸣很忙上市后首份年报:营收662亿同比增长 经调整净利27亿

雷递网 雷建平 3月31日湖南鸣鸣很忙商业连锁股份有限公司&#xff08;简称&#xff1a;“鸣鸣很忙”&#xff0c;股份代号&#xff1a;1768&#xff09;今日发布截至2025年12月31日的财报。财报显示&#xff0c;鸣鸣很忙2025年营收为661.7亿元&#xff0c;较上年他同期的393.44…...

用LED条形图可视化74HC154译码效果:STC89C52项目入门指南

用LED条形图可视化74HC154译码效果&#xff1a;STC89C52项目入门指南 第一次接触单片机时&#xff0c;看到那些闪烁的LED灯总让人充满好奇——它们是怎么按照我们的想法亮起来的&#xff1f;今天我们就用STC89C52单片机和74HC154译码器&#xff0c;亲手搭建一个会"跳舞&q…...

别再手动下载了!教你用Python+Schedule库打造个人YouTube视频自动下载工具

Python自动化神器&#xff1a;用Schedule库打造智能视频下载系统 每次手动下载YouTube视频不仅耗时耗力&#xff0c;还容易错过更新。作为Python开发者&#xff0c;我们完全可以用代码解放双手&#xff0c;打造一个全自动的视频下载系统。今天要分享的这套方案&#xff0c;结合…...

小白也能搞定:CYBER-VISION零号协议智能助盲系统部署全流程

小白也能搞定&#xff1a;CYBER-VISION零号协议智能助盲系统部署全流程 1. 系统介绍与准备工作 CYBER-VISION零号协议是一款专为视障人士设计的智能助盲系统&#xff0c;它通过先进的计算机视觉技术&#xff0c;将周围环境实时转化为可理解的语音提示。想象一下&#xff0c;当…...