Java 记录器 - 令牌的撇号问题

Woj*_*tek 4 java logging java.util.logging

我有一些无法解释的行为java.util.logging。让我们来看看这两个样本:

第一的:

boolean var = false;
log.log( Level.WARNING, "Cant {0}", new Object[] { var } );
Run Code Online (Sandbox Code Playgroud)

输出:

Cant false
Run Code Online (Sandbox Code Playgroud)

第二:

boolean var = false;
log.log( Level.WARNING, "Can't {0}", new Object[] { var } );
Run Code Online (Sandbox Code Playgroud)

输出:

不能{0}

为什么包含撇号 ( ' ) 会导致记录器不扩展令牌?

rge*_*man 5

看来您使用的任何日志记录机制都是在MessageFormat内部使用该类。如果是这样,那么您需要对撇号字符进行转义,因为它是一个单引号字符。单引号字符用于引用不打算解释的文本。

MessageFormat javadocs

在字符串中,一对单引号可用于引用除单引号之外的任意字符。例如,模式字符串“'{0}'”代表字符串“{0}”,而不是 FormatElement。单引号本身必须由整个字符串中的双引号 ''表示。

(强调我的)

尝试

log.log( Level.WARNING, "Can''t {0}", new Object[] { var } );
Run Code Online (Sandbox Code Playgroud)

这段代码:

MessageFormat mf = new MessageFormat("Can''t {0}");
System.out.println(mf.format(new Object[] {false}));
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

Can't false
Run Code Online (Sandbox Code Playgroud)