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

Java中控制台字符串颜色无法恢复为白色的问题解决

问题分析与解决方案

问题原因

  • 第17行:执行c=red+c+reset后,变量c的内容已经是红色ANSI序列+C+重置序列。后续执行c=white+c+reset,最终字符串变为白色序列+红色序列+C+重置序列+重置序列。控制台解析ANSI序列时,后出现的颜色指令会覆盖前面的,所以实际生效的是红色序列,导致输出红色。
  • 第23行:执行d=red+d后,d的内容是红色序列+D,再执行d=white+d得到白色序列+红色序列+D,同样,后出现的红色序列覆盖了白色指令,输出红色。

修改方案

核心原则是始终基于原始无格式的字符串构建带颜色的输出,不要在已包含ANSI序列的字符串上叠加新颜色指令。

方案一:保留原始字符串,直接构建输出

修改后代码如下:

class Main {
  public static final String reset="\u001B[0m";
  public static final String red="\u001B[31m";
  public static final String white="\u001B[37m";
  public static void main(String[] args) {
    System.out.println("A");
    System.out.println(red+"A"+reset);
    System.out.println(white+"A"+reset);
    String b="B";
    System.out.println(b);
    System.out.println(red+b+reset);
    System.out.println(white+b+reset);
    String c="C";
    System.out.println(c);
    // 基于原始c生成红色输出,不修改原始变量
    System.out.println(red+c+reset);
    // 基于原始c生成白色输出
    System.out.println(white+c+reset); // 现在输出白色C
    String d="D";
    System.out.println(d);
    // 基于原始d生成红色输出,不修改原始变量
    System.out.println(red+d+reset);
    // 基于原始d生成白色输出
    System.out.println(white+d+reset); // 现在输出白色D
  }
}

方案二:单独存储原始字符串(适合多次复用场景)

如果需要多次对同一内容设置不同颜色,可以把原始字符串单独存储,避免修改带格式的变量:

class Main {
  public static final String reset="\u001B[0m";
  public static final String red="\u001B[31m";
  public static final String white="\u001B[37m";
  public static void main(String[] args) {
    System.out.println("A");
    System.out.println(red+"A"+reset);
    System.out.println(white+"A"+reset);
    String b="B";
    System.out.println(b);
    System.out.println(red+b+reset);
    System.out.println(white+b+reset);
    
    // 单独存储原始字符串
    String originalC = "C";
    String c=originalC;
    System.out.println(c);
    c=red+originalC+reset;
    System.out.println(c);
    c=white+originalC+reset;
    System.out.println(c); // 输出白色C
    
    String originalD = "D";
    String d=originalD;
    System.out.println(d);
    d=red+originalD+reset;
    System.out.println(d);
    d=white+originalD+reset;
    System.out.println(d); // 输出白色D
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:55:03