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

Java标点替换为双感叹号程序无输出问题排查

修正Java字符串替换逻辑:将英文句号和感叹号替换为双感叹号(强制使用for循环)

问题分析

你提供的代码目标是把输入文本里的所有英文句号(.)和感叹号(!)替换成双感叹号(!!),但当前代码存在死循环问题,导致程序无法正常输出结果,甚至会一直运行直到资源耗尽。

原代码核心错误

  1. 死循环触发:每次替换字符后,字符串长度会增加1(单个字符换成两个字符),但for循环的i持续递增,同时循环条件i < text.length()会因为字符串动态变长而永远成立,循环根本停不下来。
  2. 字符判断冗余低效:用substring(i,i+1)截取单个字符做相等判断,不如直接调用charAt(i)获取字符来得简洁高效。
  3. 重复替换风险:替换后新插入的!会被后续循环再次判定,导致无限替换(比如!先变成!!,第二个!又会被换成!!,最终变成!!!!,以此类推)。

修正后的代码(for循环+StringBuilder优化)

import java.util.Scanner;

public class TextReplacer {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        
        System.out.println("Enter a text: ");
        String theText = input.nextLine();
        
        System.out.println("The modified text would be: ");
        System.out.println(replace(theText));
        
        input.close(); // 关闭Scanner避免资源泄漏
    }

    public static String replace(String text) {
        StringBuilder sb = new StringBuilder(text);
        // 手动控制索引递增,避免死循环和重复替换
        for (int i = 0; i < sb.length(); ) {
            char currentChar = sb.charAt(i);
            if (currentChar == '.' || currentChar == '!') {
                // 替换当前字符为"!!"
                sb.replace(i, i + 1, "!!");
                // 跳过新插入的第二个"!",避免重复替换
                i += 2;
            } else {
                // 无需替换,正常移动到下一个字符
                i++;
            }
        }
        return sb.toString();
    }
}

代码说明

  • 用StringBuilder替代直接拼接String:String是不可变对象,频繁拼接会生成大量临时对象,StringBuilder可直接在缓冲区修改,效率更高。
  • 手动控制索引i:替换成功后索引直接加2,跳过新插入的第二个!,避免重复替换;无需替换时,索引正常加1。
  • 关闭Scanner:符合Java资源管理规范,避免资源泄漏。

测试示例

输入:Hello. I am using Java!
输出:Hello!! I am using Java!!

内容的提问来源于stack exchange,提问作者Doğa Çelebi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:45:36