Java中hasNextInt()的使用场景和注意事项

 更新时间:2026年05月13日 08:28:06   作者:rx123000  
hasNextInt()方法是判断控制台接收是否为整型数字,而不是接收数据,这篇文章主要介绍了Java中hasNextInt()的使用场景和注意事项的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、hasNextInt()介绍

hasNextInt() 是 Java 中 Scanner 类的一个方法,用于检查输入流中是否存在下一个可解析为整数的“标记/段落”。仅检查输入流状态,不会消耗输入。

所属类:java.util.Scanner(需要导入该类)

返回值:boolean 类型(true 表示存在整数标记,false 表示不存在)

import java.util.Scanner;
public class InputTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入整数:");
        while (sc.hasNextInt()) {  //检查下一个“段落”是否为整数,是则返回ture,只检测不消耗
            int num = sc.nextInt();  //读取并消耗该整数
            System.out.println("输入的整数是:" + num);
        }
        
        System.out.println("非整数输入,程序退出。");
        sc.close();
    }
}

二、工作原理

需要注意的是hasNextInt()只检测下一个“段落”,默认以空白字符(空格、回车、制表符等)作为分隔符,将输入流拆分为多个“段落”。

例如输入多个回车符,此时只有分隔符没有产生“段落”,hasNextInt()仍会等待输入

输入“回车回车123  abc  回车”(中间有空格),hasNextInt()检测到下一个段落内容为“123”,返回true。并且输入的“回车回车123  abc  回车”仍留着输入缓冲区中,所以要留意接下来缓冲区内的处理方法。

三、使用场景

1、学生管理系统中需要录入学生的年龄,若直接用nextInt()接收收入,非法的输入内容(非整数输入)会让程序异常终止。为了程序的健壮性,使用hasNextInt()+nextInt()配合,避免因输入非整数而导致程序崩溃。

Scanner sc = new Scanner(System.in);
Student st = new Student();
System.out.println("请输入学生年龄:");
while (!sc.hasNextInt()) {  //判断下一个段落是否为整数
    System.out.println("请输入整数!");
    sc.next();  //消耗这个非整数段落
}
st.setAge(sc.nextInt());

2、菜单选项要求输入1-5之间的整数

//处理用户输入:确保输入为1-5之间的整数
while (true) {
    if (!sc.hasNextInt()) {
        System.out.println("输入错误,请输入数字!");
        sc.next(); //清空非整数输入
    } else {
        num = sc.nextInt();
        if (num >= 1 && num <= 5) {
            break; //输入正确,跳出循环
        } else {
            System.out.println("输入错误,请输入1-5之间的数字!");
        }
    }
}

四、注意事项

1、hasNextInt()最好与nextInt()配合使用,并注意处理输入缓冲区内的残留

例如输入“回车回车123  abc  回车”(中间有空格),hasNextInt()会返回true,接下来若用nextLine()接收仅会消耗一个回车符,仍会剩余“回车123  abc  回车”。

用nextInt()接收,会消耗123及之前的回车符,在正确接收123整数后,要注意及时清理缓冲区内剩余“  abc  回车”,避免影响后面的程序运行。

2、hasNextInt()无法回车符对出响应

场景例如,学生管理系统中需要修改某个已存在的学生的信息,功能需求为提示修改当前学生年龄后,用户可以输入新年龄、也可以按回车跳过保持原来年龄,同时对非整数输入做出响应。

由于hasNextInt()、nextInt()、next()均会跳过前导空白(空格、回车、制表符等分隔符),直接取用自己所需要的“段落”,其中nextInt()、next()会消耗下一个段落及段落前的分隔符。

所以使用hasNextInt()过滤非整数输入时,也过滤了回车输入,无法对回车符等输入单独做出响应。

需要用nextLine()对回车符对出响应,并使用isEmpty()和Integer.parseInt()等对录入的字符串再做判断和处理。

System.out.println("当前年龄:" + st.getAge());
while (true) {
    System.out.println("请修改学生年龄(若不修改按回车跳过):");
    String age = sc.nextLine();
    if (age.isEmpty()) {
        break;  //回车跳过
    } else if (stringToInt(age) >= 0) {  //自定义了个stringToInt方法用于字符串转数字,并判断非整数返回-1。
       st.setAge(stringToInt(age));
       break;
   } else {
        System.out.println("输入错误,请输入整数!");
    }
}

五、替代hasNextInt()的其他方法

1、使用try-catch

try-catch 是 Java 中用于异常处理的核心语法结构,其主要作用是捕获并处理程序运行时可能出现的异常,防止程序因未处理的异常而直接崩溃,同时允许程序在遇到异常后继续执行后续逻辑。

sc.nextInt() 尝试读取整数时,发现输入是字符串,抛出 InputMismatchException 异常。

try {
    System.out.print("请输入一个整数:");
    int num = sc.nextInt();  //可能抛出 InputMismatchException 的代码
    System.out.println("您输入的整数是:" + num);
} catch (InputMismatchException e) {
    System.out.println("输入错误,请输入整数!");  //处理异常的逻辑
    sc.next();  //清空缓冲区,避免无限循环
}

总结 

到此这篇关于Java中hasNextInt()的使用场景和注意事项的文章就介绍到这了,更多相关Java中hasNextInt()使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java生成word文档的示例详解

    Java生成word文档的示例详解

    这篇文章主要为大家详细介绍了如何利用Java语言生成word文档,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考一下
    2022-12-12
  • java利用数组求平均值,最大值,最小值

    java利用数组求平均值,最大值,最小值

    java利用数组求平均值,最大值,最小值。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • 使用kotlin编写spring cloud微服务的过程

    使用kotlin编写spring cloud微服务的过程

    这篇文章主要介绍了使用kotlin编写spring cloud微服务的相关知识,本文给大家提到配置文件的操作代码,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 使用Spring Data Jpa的CriteriaQuery一个陷阱

    使用Spring Data Jpa的CriteriaQuery一个陷阱

    使用Spring Data Jpa的CriteriaQuery进行动态条件查询时,可能会遇到一个陷阱,当条件为空时,查询不到任何结果,并不是期望的返回所有结果。这是为什么呢?
    2020-11-11
  • maven依赖冲突加载顺序与解决

    maven依赖冲突加载顺序与解决

    这篇文章主要介绍了项目中同时引用了相同依赖的不同版本,也就是冲突,maven 是如何选择的,了解了有助于解决项目中的依赖问题,需要的朋友可以参考下
    2024-01-01
  • Java基础巩固抽象类与接口详解

    Java基础巩固抽象类与接口详解

    在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类,接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成,本文给大家介绍Java抽象类和接口,感兴趣的朋友一起看看吧
    2022-05-05
  • 浅谈Java父子类加载顺序

    浅谈Java父子类加载顺序

    本文主要介绍了Java父子类加载顺序,那么这么长怎么记呀?本文就帮大家总结一下,更有利于记忆,感兴趣的可以了解一下
    2021-08-08
  • java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    这篇文章主要介绍了java 如何压缩图片体积,帮助大家更好的利用Java处理图片,应对特殊情况,感兴趣的朋友可以了解下
    2020-10-10
  • SpringBoot实现多种来源的Zip多层目录打包下载

    SpringBoot实现多种来源的Zip多层目录打包下载

    这篇文章主要为大家详细介绍了SpringBoot如何实现多种来源的 Zip 多层目录打包下载,包括本地文件和HTTP混合,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

    SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

    本文介绍了如何在Spring Boot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页面,可以生成和验证验证码,文中指出了在项目结构上的注意事项,避免因包结构问题导致验证码无法显示
    2025-01-01

最新评论