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

如何修复NetBeans中Java加密程序符号竖排输出及数组越界异常问题

Java加密程序核心问题修复指南

现存问题根因拆解

  • 数组越界异常来源
    原代码将循环终止条件硬编码为counter < 99999,但存储用户输入的letters数组实际长度由输入内容决定,比如测试文本"password encrypted"仅包含18个字符(数组最大下标为17)。当循环计数超过数组实际长度时,就会触发java.lang.ArrayIndexOutOfBoundsException;由于控制台输出的实时刷新逻辑和异常抛出时机存在错位,才会出现异常提示夹在输出内容中间的现象。
  • 密文逐字符换行的根源
    每个字符完成映射转换后,代码调用的是System.out.println(xxx)完成输出,该方法会在输出内容后自动追加换行符,最终导致每个转换后的符号单独占一行。配套解密程序读取密文时,会把换行符当成密文的一部分,自然无法匹配符号和原字母的对应关系。
  • 代码冗余问题
    原代码为每个映射规则单独定义了20多个独立字符串变量,这些变量赋值后立刻被打印,没有实际存储价值,属于无意义的冗余代码。

分步修复方案

  1. 修正循环边界,从根源避免数组越界
    将原硬编码的循环终止条件替换为和输入数组实际长度绑定的判断:
    // 替换原 for (int counter = 0;  counter < 99999; counter++)
    for (int counter = 0; counter < letters.length; counter++)
    
  2. 取消逐字符即时打印,统一拼接密文后单次输出
    在循环外部创建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);
    
  3. 简化映射逻辑(可选优化)
    原有连续写20余条if判断的写法可以替换为映射表结构,用一个固定长度的数组对应a-z的符号映射关系,既可以减少冗余代码,后续调整映射规则、配合解密程序做反向匹配时也更易维护。

修复完成后,输出的密文会是连续无换行的字符串,解密程序只需按照相同的映射规则做反向匹配,即可正常完成解密流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 10:36:02