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

如何解决Java StringBuffer清除缓冲及加密输出附带原始明文的问题

问题排查与修复方案

核心问题点

  • StringBuffer.replace()方法使用错误:该方法替换范围为左闭右开区间[start, end),你传入的start和end参数值相同,仅会在对应位置插入新字符,不会覆盖原有字符,导致原始明文被保留。
  • 索引计算逻辑错误:循环内每次都会重新初始化k = 数组长度后减1,k值全程固定,计算得到的替换位置永远为0,所有加密字符都会插入到字符串开头,无法实现逐位替换的预期效果。
  • 输出明文的本质原因:你实例化自定义类thirdd时,将原始明文letter作为参数传入,且该类的toString()方法包含原始明文的输出逻辑,和缓冲区是否清空没有关联。
  • 存在大量无效冗余代码:替换完成后拆分字符串为数组再重新拼接的操作没有实际作用,可直接删除。

修复代码示例

public class third {
    public static void main(String[] args) {
        String letter = "drukarka";
        String result = "Result of cypher: ";
        StringBuffer cypher = new StringBuffer(letter);

        // 直接遍历字符串的每个字符位置即可,无需拆分数组
        for (int i = 0; i < cypher.length(); i++) {
            char current = cypher.charAt(i);
            // 替换单个字符直接用setCharAt更简便,也可以用replace(i, i+1, 替换值)
            switch (current) {
                case 'd': cypher.setCharAt(i, '#'); break;
                case 'r': cypher.setCharAt(i, '!'); break;
                case 'u': cypher.setCharAt(i, '$'); break;
                case 'k': cypher.setCharAt(i, '&'); break;
                case 'a': cypher.setCharAt(i, ';'); break;
            }
        }
        String cyphered = cypher.toString();
        thirdd construction = new thirdd();
        // 如果不需要输出原始明文,就不要传入letter参数,或者修改thirdd类的toString方法去掉原始明文输出
        construction.constructor(letter, result, cyphered);
        System.out.println(construction.toString());
    }
}

额外说明

如果不需要输出原始明文,要么调整thirdd类的入参,不要传入原始letter变量,要么修改该类的toString()方法,移除原始明文的输出逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:27:03