将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
相关产品推荐
相关产品推荐

