Java程序输入校验缺陷:违规接受数字字符串及负索引值
解决Java程序中的输入验证问题:禁止数字姓名与负索引输入
看起来你遇到了输入验证的漏洞——你的程序现在允许用户输入纯数字的姓名,还有负的索引值,这完全不符合预期的规则。别担心,我们可以通过添加输入校验逻辑来搞定这个问题,下面一步步来:
首先明确你的问题场景:
- 预期:姓名只能是纯文本(不能含数字),起始/结束索引必须是非负整数
- 现状:程序完全没做校验,导致非法输入直接被接受
先把你提供的现有代码片段放出来(看起来你只贴了类的开头部分):
import java.util.Scanner; public class Module2{ public Module2(){ } // 应该还有处理输入的方法没贴出来 }
解决方案:添加输入校验逻辑
我们可以通过正则表达式验证姓名,通过整数解析+范围判断验证索引,同时循环提示用户直到输入符合要求。下面是完整的修正代码:
import java.util.Scanner; import java.util.regex.Pattern; public class Module2 { // 正则规则:姓名只能包含大小写字母和空格(支持全名,比如"Harshal Kumar") private static final Pattern VALID_NAME_PATTERN = Pattern.compile("^[a-zA-Z\\s]+$"); public Module2() { Scanner scanner = new Scanner(System.in); // 获取符合要求的姓名 String validName = getValidNameInput(scanner); System.out.println("谢谢"); // 获取符合要求的起始索引(非负整数) int validStartIndex = getValidNonNegativeIndex(scanner, "起始"); System.out.println("谢谢"); // 获取符合要求的结束索引(非负+不小于起始索引) int validEndIndex = getValidEndIndex(scanner, validStartIndex); System.out.println("谢谢"); scanner.close(); System.out.println("结束应用"); } // 处理姓名输入,直到用户输入合法内容 private String getValidNameInput(Scanner scanner) { String name; while (true) { System.out.print("请输入您的姓名:"); name = scanner.nextLine().trim(); // 校验1:姓名不能为空 if (name.isEmpty()) { System.out.println("姓名不能为空,请重新输入!"); } // 校验2:姓名不能包含数字或特殊字符 else if (!VALID_NAME_PATTERN.matcher(name).matches()) { System.out.println("姓名只能包含字母和空格,不能有数字或特殊字符,请重新输入!"); } // 输入合法,跳出循环 else { break; } } return name; } // 处理非负索引输入(起始/结束通用) private int getValidNonNegativeIndex(Scanner scanner, String indexType) { int index; while (true) { System.out.printf("请输入%s索引值:", indexType); try { // 尝试解析输入为整数 index = Integer.parseInt(scanner.nextLine().trim()); // 校验:索引不能为负数 if (index < 0) { System.out.println(indexType + "索引不能是负数,请重新输入!"); } else { break; } } catch (NumberFormatException e) { // 处理非整数输入的情况 System.out.println("请输入有效的整数索引值!"); } } return index; } // 处理结束索引,额外确保不小于起始索引 private int getValidEndIndex(Scanner scanner, int startIndex) { int endIndex; while (true) { endIndex = getValidNonNegativeIndex(scanner, "结束"); if (endIndex < startIndex) { System.out.println("结束索引不能小于起始索引,请重新输入!"); } else { break; } } return endIndex; } // 程序入口 public static void main(String[] args) { new Module2(); } }
代码说明
- 姓名校验:用正则
VALID_NAME_PATTERN限制输入只能是字母和空格,同时排除空输入,确保姓名符合要求 - 索引校验:
- 用
Integer.parseInt解析输入,捕获NumberFormatException处理用户输入非整数的情况 - 强制判断索引≥0,拒绝负数输入
- 额外添加结束索引≥起始索引的校验,避免后续业务逻辑(比如字符串截取)出现异常
- 用
测试效果
- 预期正常流程:
启动应用
请输入您的姓名:Harshal
谢谢
请输入起始索引值:1
谢谢
请输入结束索引值:1
谢谢
结束应用
非法输入处理:
- 输入数字姓名:
请输入您的姓名:3
姓名只能包含字母和空格,不能有数字或特殊字符,请重新输入!
请输入您的姓名:Harshal
谢谢- 输入负索引:
请输入起始索引值:-1
起始索引不能是负数,请重新输入!
请输入起始索引值:1
谢谢
这样修改后,你的程序就能严格按照预期规则接受输入啦!
内容的提问来源于stack exchange,提问作者Mew
相关产品推荐
相关产品推荐

