Java如何实现指定单字符输入校验 非指定字符输入时报错
Java指定单字符采集校验实现
现存问题
当前学生信息录入逻辑需要采集两类固定单字符输入:
- 学生类型:
L代表本地学生,I代表国际学生 - 课程类型:
E/M/P/C分别对应四类不同课程
原有实现存在以下问题: - 输入校验缺失:获取输入后直接调用
charAt(0)截取首位字符,即使用户输入多字符字符串、数字等不符合要求的内容,程序也不会触发错误,仅截取首位使用,无法保证输入符合单字符、指定值的要求 - 隐藏逻辑bug:
studentname数组初始化长度为2,和10个学生的录入量级不匹配,循环录入到第3个学生时会触发数组越界;学生类型读取后存入局部变量t,未写入stype数组,会造成数据丢失
原有缺陷代码如下:
public static void main(String[] args) { Scanner input = new Scanner(System.in); double electrical_e_cost = 850.53; double mechanical_eng_cost =895.25; double petroleum_eng_cost = 450.67; double computer_eng_cost = 921.14; int studentcount = 10; int idnumber []=new int[10]; String[] studentname = new String[2]; int courseamount[]=new int [10]; char stype []=new char[10]; char coursetype []=new char[10]; for(int i=0; i<idnumber.length;i++) { System.out.println("Enter Name "); studentname[i]=input.next(); System.out.println("Please enter Student ID number "); idnumber[i]= input.nextInt(); System.out.print("Please say wheather you are an internationanal or Local student by typing I or L respectively"); char t=input.next().charAt(0); System.out.println("Please enter the course type either E,M,P,C "); coursetype[i] =input.next().charAt(0); System.out.println("Please enter The course amount "); courseamount[i]= input.nextInt(); } }
修复实现
核心校验规则需要覆盖两个维度:
- 输入内容去空格后长度必须为1,禁止多字符输入
- 输入的单字符必须属于预设的合法值范围,非法输入需要提示用户重新录入
可以抽取通用的单字符采集方法统一处理校验逻辑,同时兼容小写输入自动转大写、处理Scanner输入残留的换行符问题,修复后完整代码如下:
import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class StudentInfoInput { // 通用合法单字符采集方法 private static char getValidSingleChar(Scanner sc, String tip, Set<Character> validChars) { while (true) { System.out.println(tip); // 读取输入并去除首尾空格 String inputContent = sc.next().trim(); // 消费掉输入流中残留的换行/多余内容,避免影响后续输入 sc.nextLine(); // 长度校验:必须为单字符 if (inputContent.length() != 1) { System.out.println("输入错误:请仅输入单个有效字符,不要输入多字符、数字等内容"); continue; } char inputChar = Character.toUpperCase(inputContent.charAt(0)); // 合法值校验 if (!validChars.contains(inputChar)) { System.out.printf("输入错误:仅允许输入以下字符%s,请重新输入%n", validChars); continue; } return inputChar; } } public static void main(String[] args) { Scanner input = new Scanner(System.in); // 课程费用常量 final double ELECTRICAL_E_COST = 850.53; final double MECHANICAL_ENG_COST = 895.25; final double PETROLEUM_ENG_COST = 450.67; final double COMPUTER_ENG_COST = 921.14; final int STUDENT_COUNT = 10; // 修复数组长度不匹配问题 int[] idNumber = new int[STUDENT_COUNT]; String[] studentName = new String[STUDENT_COUNT]; int[] courseAmount = new int[STUDENT_COUNT]; char[] sType = new char[STUDENT_COUNT]; char[] courseType = new char[STUDENT_COUNT]; // 预定义合法字符集合 Set<Character> validStudentType = new HashSet<>(); validStudentType.add('L'); validStudentType.add('I'); Set<Character> validCourseType = new HashSet<>(); validCourseType.add('E'); validCourseType.add('M'); validCourseType.add('P'); validCourseType.add('C'); for (int i = 0; i < STUDENT_COUNT; i++) { System.out.println("---------- 录入第" + (i+1) + "位学生信息 ----------"); System.out.println("请输入学生姓名:"); studentName[i] = input.next(); input.nextLine(); System.out.println("请输入学生ID:"); idNumber[i] = input.nextInt(); input.nextLine(); // 采集学生类型,自动校验 sType[i] = getValidSingleChar(input, "请输入学生类型:L代表本地学生,I代表国际学生", validStudentType); // 采集课程类型,自动校验 courseType[i] = getValidSingleChar(input, "请输入课程类型:E/M/P/C分别对应四类课程", validCourseType); System.out.println("请输入课程数量:"); courseAmount[i] = input.nextInt(); input.nextLine(); } input.close(); } }
逻辑说明
- 单字符采集方法采用循环重试机制,只有输入完全符合规则才会返回结果,不会出现非法值直接截断首位使用的问题
- 自动将用户输入的小写字符转为大写匹配规则,降低用户输入成本
- 注意:Scanner调用
nextInt/next方法后会遗留换行符在输入流中,如果不主动消费,后续读取输入会直接拿到空字符串,属于Java Scanner使用的常见坑,修复代码中每次读取输入后都主动消费流中残留内容,避免这类问题 - 同步修复了原代码中
studentname数组长度和学生总数不匹配导致的数组越界、学生类型读取后未存入stype数组的数据丢失问题
内容的提问来源于stack exchange,提问作者Kaylon Haven
相关产品推荐
相关产品推荐

