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

Java如何限制用户输入为指定选项?基于血型存储程序的问询

改进血型信息存储程序的输入验证功能

需求说明

当前Java程序用于存储患者血型信息,已实现构造器重载(默认血型O+,支持自定义输入),需补充以下验证逻辑:

  • 血型仅允许输入:A、O、B、AB
  • Rh因子仅允许输入:+、-
  • 输入不符合要求时,输出错误提示,避免无效数据存入

现有代码问题

  1. BloodData类的带参构造器直接赋值,未做合法性校验
  2. 主程序未对用户输入值进行范围检查
  3. 异常捕获仅针对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:02:40