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

如何实现USSD触发医疗信息查询程序及解决ArrayList索引越界问题

问题解决方案

一、USSD码触发程序运行的实现

在Java环境中,USSD功能的实现核心是对接移动运营商的USSD网关,接收网关转发的请求并处理。以下是基础实现思路和示例代码:

  1. 对接运营商USSD网关
    • 向本地运营商申请USSD服务,获取分配的专属USSD码(如*123#),并配置网关回调地址(需确保服务能被运营商网关访问)。
  2. 编写USSD请求处理逻辑
    以Spring Boot为例,编写Controller接收网关的POST请求:
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UssdController {
    
        @PostMapping("/ussd/callback")
        public String handleUssdRequest(@RequestBody UssdRequest request) {
            String ussdInput = request.getUssdInput();
            String userPhone = request.getPhoneNumber();
    
            // 匹配触发码,启动医疗信息服务逻辑
            if ("*123#".equals(ussdInput)) {
                return "欢迎使用本地医疗信息服务,请输入疾病编号查询详情:";
            } else {
                // 处理用户后续输入的疾病编号
                return queryMedicalInfo(ussdInput);
            }
        }
    
        private String queryMedicalInfo(String code) {
            // 调用你的疾病信息查询逻辑,示例返回固定内容
            return switch(code) {
                case "1" -> "【高血压】症状:头晕头痛,日常建议低盐饮食、规律作息";
                case "2" -> "【糖尿病】症状:多饮多尿,需监测血糖,遵循医嘱用药";
                default -> "未找到对应疾病信息,请重新输入";
            };
        }
    }
    
    // 根据运营商网关参数结构调整的请求实体类
    class UssdRequest {
        private String ussdInput;
        private String phoneNumber;
    
        // getter、setter方法
        public String getUssdInput() { return ussdInput; }
        public void setUssdInput(String ussdInput) { this.ussdInput = ussdInput; }
        public String getPhoneNumber() { return phoneNumber; }
        public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; }
    }
    
  3. 关键注意事项
    • 不同运营商的USSD请求参数格式存在差异,需根据实际文档调整UssdRequest字段。
    • USSD会话是状态化的,需维护用户交互步骤(可使用Redis存储会话状态)。

二、ArrayList IndexOutOfBoundsException异常解决

异常根源

当访问ArrayList的索引小于0,或大于等于集合的size()时,会触发该异常。典型错误代码:

ArrayList<String> diseaseList = new ArrayList<>();
diseaseList.add("高血压");
diseaseList.add("糖尿病");
// 索引2超出集合有效范围(0-1)
String target = diseaseList.get(2); // 抛出IndexOutOfBoundsException

解决方法

  1. 访问前校验索引合法性
    在调用get()方法前,先判断索引是否在有效范围内:

    int targetIndex = 2;
    if (targetIndex >= 0 && targetIndex < diseaseList.size()) {
        String disease = diseaseList.get(targetIndex);
        // 业务处理逻辑
    } else {
        System.out.println("无效的疾病编号,请重新输入");
    }
    
  2. 避免硬编码索引
    遍历集合时优先使用增强for循环或迭代器,避免手动指定索引:

    // 推荐遍历方式
    for (String disease : diseaseList) {
        System.out.println(disease);
    }
    
    // 必须用索引时,依赖size()控制循环边界
    for (int i = 0; i < diseaseList.size(); i++) {
        String disease = diseaseList.get(i);
        // 业务处理逻辑
    }
    
  3. 使用默认值处理无效索引
    若允许返回默认值,可借助Java 8+的工具方法:

    import java.util.Collections;
    
    int targetIndex = 2;
    String disease = Collections.singletonList(diseaseList)
                                .getOrDefault(targetIndex, "未找到对应疾病信息");
    
  4. 校验集合初始化状态
    确保集合在使用前已正确添加元素,避免空集合或元素数量不足的情况:

    ArrayList<String> emptyList = new ArrayList<>();
    if (!emptyList.isEmpty()) {
        String firstItem = emptyList.get(0);
        // 业务处理逻辑
    } else {
        System.out.println("暂无疾病信息");
    }
    

内容的提问来源于stack exchange,提问作者thattCharles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:12:47