Java中hasNextInt()的使用场景和注意事项
作者:rx123000
一、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()使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
