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

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();
    }
}

代码说明

  1. 姓名校验:用正则VALID_NAME_PATTERN限制输入只能是字母和空格,同时排除空输入,确保姓名符合要求
  2. 索引校验:
    • 用Integer.parseInt解析输入,捕获NumberFormatException处理用户输入非整数的情况
    • 强制判断索引≥0,拒绝负数输入
    • 额外添加结束索引≥起始索引的校验,避免后续业务逻辑(比如字符串截取)出现异常

测试效果

  • 预期正常流程:

启动应用
请输入您的姓名:Harshal
谢谢
请输入起始索引值:1
谢谢
请输入结束索引值:1
谢谢
结束应用

  • 非法输入处理:

    • 输入数字姓名:

    请输入您的姓名:3
    姓名只能包含字母和空格,不能有数字或特殊字符,请重新输入!
    请输入您的姓名:Harshal
    谢谢

    • 输入负索引:

    请输入起始索引值:-1
    起始索引不能是负数,请重新输入!
    请输入起始索引值:1
    谢谢

这样修改后,你的程序就能严格按照预期规则接受输入啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:35:31