如何修复NetBeans中Java加密程序符号竖排输出及数组越界异常问题
Java加密程序核心问题修复指南
现存问题根因拆解
- 数组越界异常来源
原代码将循环终止条件硬编码为counter < 99999,但存储用户输入的letters数组实际长度由输入内容决定,比如测试文本"password encrypted"仅包含18个字符(数组最大下标为17)。当循环计数超过数组实际长度时,就会触发java.lang.ArrayIndexOutOfBoundsException;由于控制台输出的实时刷新逻辑和异常抛出时机存在错位,才会出现异常提示夹在输出内容中间的现象。 - 密文逐字符换行的根源
每个字符完成映射转换后,代码调用的是System.out.println(xxx)完成输出,该方法会在输出内容后自动追加换行符,最终导致每个转换后的符号单独占一行。配套解密程序读取密文时,会把换行符当成密文的一部分,自然无法匹配符号和原字母的对应关系。 - 代码冗余问题
原代码为每个映射规则单独定义了20多个独立字符串变量,这些变量赋值后立刻被打印,没有实际存储价值,属于无意义的冗余代码。
分步修复方案
- 修正循环边界,从根源避免数组越界
将原硬编码的循环终止条件替换为和输入数组实际长度绑定的判断:// 替换原 for (int counter = 0; counter < 99999; counter++) for (int counter = 0; counter < letters.length; counter++) - 取消逐字符即时打印,统一拼接密文后单次输出
在循环外部创建StringBuilder对象,用于累积拼接所有转换后的密文字符;每完成一个字符的映射,就将对应符号追加到拼接容器中,等所有字符处理完成后,一次性输出完整密文,彻底消除逐字符换行的问题。
核心逻辑参考:// 循环外初始化拼接容器 StringBuilder encryptedText = new StringBuilder(); for (int counter = 0; counter < letters.length; counter++){ char current = letters[counter]; // 原有映射判断逻辑保留,把原来的 System.out.println(映射符号) 替换为 追加到容器 if(current == 'a'){ encryptedText.append("!"); } if(current == 'b'){ encryptedText.append("@"); } // 其余字母、空格、特殊符号的映射逻辑同理替换 if(current == ' '){ encryptedText.append(" "); } } // 所有字符处理完成后,一次性输出结果 System.out.println("加密结果:" + encryptedText); - 简化映射逻辑(可选优化)
原有连续写20余条if判断的写法可以替换为映射表结构,用一个固定长度的数组对应a-z的符号映射关系,既可以减少冗余代码,后续调整映射规则、配合解密程序做反向匹配时也更易维护。
修复完成后,输出的密文会是连续无换行的字符串,解密程序只需按照相同的映射规则做反向匹配,即可正常完成解密流程。
内容的提问来源于stack exchange,提问作者geo。
相关产品推荐
相关产品推荐

