Java自定义字符串删除方法执行异常,求助问题排查
Java字符串删除方法的问题排查与修复
核心问题分析
你的代码存在两个关键错误,直接导致了异常输出:
- 错误使用
Arrays.toString()转换字符数组:Arrays.toString(char[])的作用是生成数组的调试字符串(比如[a, b, c]),包含方括号、逗号和空格,并不是你需要的纯字符拼接字符串。但你在j_delete_char里直接返回这个结果,后续j_delete_all_chars处理时会把这些格式符号当成普通字符,最终导致嵌套的混乱输出。 j_delete_all_chars逻辑依赖错误中间结果:因为j_delete_char返回带格式的字符串,后续循环把它转成char数组时,会包含[、,、这些无关字符,找删除目标的逻辑完全失效。
修复后的代码
修复j_delete_char方法
把Arrays.toString(ret_s_array)改成new String(ret_s_array),直接生成纯字符字符串,同时补充索引合法性判断:
import java.util.Arrays; public static String j_delete_char(String s, int index) { if (index < 0 || index >= s.length()) { return s; } char[] s_array = s.toCharArray(); char[] ret_s_array = new char[s.length() - 1]; // 用System.arraycopy优化数组复制,比手动循环更高效 System.arraycopy(s_array, 0, ret_s_array, 0, index); System.arraycopy(s_array, index + 1, ret_s_array, index, s.length() - index - 1); return new String(ret_s_array); // 关键修复:生成纯字符字符串 }
修复j_delete_all_chars方法
推荐用StringBuilder直接过滤目标字符,效率更高;如果坚持原循环删除的思路,也可以优化逻辑:
// 高效版:直接过滤目标字符 public static String j_delete_all_chars(String s, char to_del) { StringBuilder sb = new StringBuilder(); for (char c : s.toCharArray()) { if (c != to_del) { sb.append(c); } } return sb.toString(); } // 兼容原思路的修复版:循环删除目标字符 public static String j_delete_all_chars_v2(String s, char to_del) { String result = s; int index = result.indexOf(to_del); while (index != -1) { result = j_delete_char(result, index); index = result.indexOf(to_del); } return result; }
测试验证
- 调用
j_delete_char("abcdef", 3)返回abcef,如果需要[a, b, c, e, f]格式,只需在结果上执行Arrays.toString(result.toCharArray()) - 调用
j_delete_all_chars("abcdef22abcd", '2')返回abcdefabcd,执行Arrays.toString(result.toCharArray())即可得到预期的[a, b, c, d, e, f, a, b, c, d]
额外建议
- 字符串处理优先用
StringBuilder,避免频繁创建字符串和数组带来的性能损耗 - 索引判断要覆盖小于0的情况,防止数组越界异常
Arrays.toString()是调试工具,不要用来生成业务所需的字符串
内容的提问来源于stack exchange,提问作者explorecomp
相关产品推荐
相关产品推荐

