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

将char数组元素转换为int时触发NumberFormatException错误排查

问题分析与修复方案

首先,咱们来看你遇到的NumberFormatException,核心问题出在char转ASCII值的方式完全用错了,另外代码里还有两个隐藏的bug,我给你一一拆解:

错误点1:错误的char转ASCII方式

你写的Integer.parseInt(String.valueOf(passChars[i]))是完全没必要的,而且会直接报错。因为当你把字符'M'转成字符串后是"M",这根本不是数字,Integer.parseInt自然会抛出格式异常。

其实char类型本身就可以直接强转为int来获取对应的ASCII值,比如(int) 'M'会直接返回77,这才是正确的姿势。

错误点2:未初始化的数组导致潜在空指针

你声明了int ascii[] = null;但从来没给它分配长度,循环里给ascii[i]赋值的时候,会触发NullPointerException——只不过现在先触发了格式异常,这个问题还没暴露出来。

错误点3:初始化为null的字符串拼接问题

encrypted初始值是null,当你第一次执行encrypted = encrypted + ...的时候,会把null当成字符串拼接进去,最终结果会以null开头,比如输入M会得到nullÚ,这显然不是你想要的加密结果。


修复后的完整代码

public static String encrypt(String password) {
    // 初始化空字符串,避免null开头的问题
    String encrypted = "";
    char passChars[] = password.toCharArray();
    // 初始化数组长度为密码字符数组的长度
    int ascii[] = new int[passChars.length];
    
    for(int i = 0; i < passChars.length; i++) {
        // 直接强转char为int获取ASCII值
        ascii[i] = (int) passChars[i];
        ascii[i] = ascii[i] + 17;
        passChars[i] = (char) ascii[i];
        encrypted += String.valueOf(passChars[i]);
    }
    return encrypted;
}

额外优化建议

其实你甚至可以不用ascii数组,直接在循环里处理,让代码更简洁高效:

public static String encrypt(String password) {
    StringBuilder encrypted = new StringBuilder();
    for (char c : password.toCharArray()) {
        // 直接对char做运算,强转后拼接
        encrypted.append((char) (c + 17));
    }
    return encrypted.toString();
}

这里用StringBuilder代替字符串拼接,避免了每次拼接都创建新字符串的性能损耗,尤其是当密码较长的时候优势更明显。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:37:39