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

Java使用charAt(0)校验社保号首字符出现非预期输出问题

问题根因
  • 核心错误是混淆了char类型的字符编码值和实际数字值:String.charAt()返回的是字符类型,你拿到的首字符'3'对应的ASCII编码值为51,直接和整数3比较时51 > 3结果为真,因此误触发Error1输出。
  • 第二个判断存在同样的类型匹配问题:charAt(1)返回的第二位字符'0'对应ASCII值为48,和整数9比较时48 > 9也为真,同样会出现误判。
  • 缺失前置校验逻辑:如果member.getCpr()返回null,或者社保号长度小于2,调用charAt()会直接抛出空指针异常或数组索引越界异常。
  • 额外逻辑漏洞:单个数字字符转换为整数后最大值为9,第二位数值 >9的条件永远无法成立,需要根据你本国的社保号规则调整判断阈值。
修复方案

先将字符转为对应的整数值再做比较,同时补充前置校验避免运行时异常,修改后的代码如下:

public void authenticateCpr(Member member){
    String cpr = member.getCpr();
    // 前置校验:先判断社保号格式合法性
    if (cpr == null || cpr.length() < 2) {
        System.out.println("Error: 社保号格式不合法");
        return;
    }
    // 字符转数值两种写法二选一即可
    int firstDigit = cpr.charAt(0) - '0'; // 利用ASCII码连续特性直接计算
    int secondDigit = Character.getNumericValue(cpr.charAt(1)); // JDK工具方法,可读性更高
    
    if (firstDigit > 3) {
        System.out.println("Error 1");
    }
    // 请根据实际规则调整此处的判断阈值,当前>9的条件永远不成立
    if (firstDigit == 3 && secondDigit > 9){
        System.out.println("Error 2");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 07:48:03