You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 输入内容去空格后长度必须为1,禁止多字符输入
  2. 输入的单字符必须属于预设的合法值范围,非法输入需要提示用户重新录入
    可以抽取通用的单字符采集方法统一处理校验逻辑,同时兼容小写输入自动转大写、处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 09:42:26