Java如何限制用户输入为指定选项?基于血型存储程序的问询
改进血型信息存储程序的输入验证功能
需求说明
当前Java程序用于存储患者血型信息,已实现构造器重载(默认血型O+,支持自定义输入),需补充以下验证逻辑:
- 血型仅允许输入:
A、O、B、AB - Rh因子仅允许输入:
+、- - 输入不符合要求时,输出错误提示,避免无效数据存入
现有代码问题
BloodData类的带参构造器直接赋值,未做合法性校验- 主程序未对用户输入值进行范围检查
- 异常捕获仅针对
InputMismatchException,但字符串输入不会触发该异常
修改方案及代码实现
步骤1:为BloodData类添加验证工具方法
将合法值转为集合提升查询效率,添加静态方法验证输入合法性:
import java.util.Arrays; import java.util.HashSet; import java.util.Set; class BloodData { // 存储合法血型与Rh因子的集合 private static final Set<String> VALID_BLOOD_TYPES = new HashSet<>(Arrays.asList("A", "O", "B", "AB")); private static final Set<String> VALID_RH_FACTORS = new HashSet<>(Arrays.asList("+", "-")); private String bloodType; private String rhFactor; // 默认构造器:设置默认血型O+ public BloodData() { this.bloodType = "O"; this.rhFactor = "+"; } // 带参构造器:仅接收合法值,否则抛出异常 public BloodData(String bt, String rh) { if (!isValidBloodType(bt)) { throw new IllegalArgumentException("无效血型!仅支持输入A、O、B、AB"); } if (!isValidRhFactor(rh)) { throw new IllegalArgumentException("无效Rh因子!仅支持输入+或-"); } this.bloodType = bt; this.rhFactor = rh; } // 验证血型合法性(支持忽略大小写与空格) public static boolean isValidBloodType(String bt) { return VALID_BLOOD_TYPES.contains(bt.trim().toUpperCase()); } // 验证Rh因子合法性(支持忽略空格) public static boolean isValidRhFactor(String rh) { return VALID_RH_FACTORS.contains(rh.trim()); } public void display() { System.out.println(bloodType + rhFactor + " 已添加至血库。"); } }
步骤2:修改主程序RunBloodData,添加输入校验与错误提示
在获取用户输入后先验证合法性,合法则创建对象,否则输出错误提示:
import java.util.Scanner; public class RunBloodData { public static void main(String[] args) { Scanner scan = new Scanner(System.in); do { System.out.print("请输入患者血型:"); String inputBloodType = scan.nextLine().trim(); System.out.print("请输入Rh因子(+或-):"); String inputRhFactor = scan.nextLine().trim(); try { BloodData bd; if (inputBloodType.isBlank() || inputRhFactor.isBlank()) { bd = new BloodData(); // 输入为空时使用默认值 bd.display(); } else { // 先验证输入合法性 if (!BloodData.isValidBloodType(inputBloodType)) { throw new IllegalArgumentException("无效血型!仅支持输入A、O、B、AB"); } if (!BloodData.isValidRhFactor(inputRhFactor)) { throw new IllegalArgumentException("无效Rh因子!仅支持输入+或-"); } bd = new BloodData(inputBloodType.toUpperCase(), inputRhFactor); bd.display(); } } catch (IllegalArgumentException e) { System.out.println("输入错误:" + e.getMessage()); } } while (true); } }
运行效果示例
请输入患者血型: 请输入Rh因子(+或-): O+ 已添加至血库。 请输入患者血型:C 请输入Rh因子(+或-):+ 输入错误:无效血型!仅支持输入A、O、B、AB 请输入患者血型:AB 请输入Rh因子(+或-):* 输入错误:无效Rh因子!仅支持输入+或- 请输入患者血型:a 请输入Rh因子(+或-):- A- 已添加至血库。
内容的提问来源于stack exchange,提问作者Annika
相关产品推荐
相关产品推荐

