如何实现USSD触发医疗信息查询程序及解决ArrayList索引越界问题
问题解决方案
一、USSD码触发程序运行的实现
在Java环境中,USSD功能的实现核心是对接移动运营商的USSD网关,接收网关转发的请求并处理。以下是基础实现思路和示例代码:
- 对接运营商USSD网关
- 向本地运营商申请USSD服务,获取分配的专属USSD码(如
*123#),并配置网关回调地址(需确保服务能被运营商网关访问)。
- 向本地运营商申请USSD服务,获取分配的专属USSD码(如
- 编写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; } } - 关键注意事项
- 不同运营商的USSD请求参数格式存在差异,需根据实际文档调整
UssdRequest字段。 - USSD会话是状态化的,需维护用户交互步骤(可使用Redis存储会话状态)。
- 不同运营商的USSD请求参数格式存在差异,需根据实际文档调整
二、ArrayList IndexOutOfBoundsException异常解决
异常根源
当访问ArrayList的索引小于0,或大于等于集合的size()时,会触发该异常。典型错误代码:
ArrayList<String> diseaseList = new ArrayList<>(); diseaseList.add("高血压"); diseaseList.add("糖尿病"); // 索引2超出集合有效范围(0-1) String target = diseaseList.get(2); // 抛出IndexOutOfBoundsException
解决方法
访问前校验索引合法性
在调用get()方法前,先判断索引是否在有效范围内:int targetIndex = 2; if (targetIndex >= 0 && targetIndex < diseaseList.size()) { String disease = diseaseList.get(targetIndex); // 业务处理逻辑 } else { System.out.println("无效的疾病编号,请重新输入"); }避免硬编码索引
遍历集合时优先使用增强for循环或迭代器,避免手动指定索引:// 推荐遍历方式 for (String disease : diseaseList) { System.out.println(disease); } // 必须用索引时,依赖size()控制循环边界 for (int i = 0; i < diseaseList.size(); i++) { String disease = diseaseList.get(i); // 业务处理逻辑 }使用默认值处理无效索引
若允许返回默认值,可借助Java 8+的工具方法:import java.util.Collections; int targetIndex = 2; String disease = Collections.singletonList(diseaseList) .getOrDefault(targetIndex, "未找到对应疾病信息");校验集合初始化状态
确保集合在使用前已正确添加元素,避免空集合或元素数量不足的情况:ArrayList<String> emptyList = new ArrayList<>(); if (!emptyList.isEmpty()) { String firstItem = emptyList.get(0); // 业务处理逻辑 } else { System.out.println("暂无疾病信息"); }
内容的提问来源于stack exchange,提问作者thattCharles
相关产品推荐
相关产品推荐

