我对java.util.logging
有一些无法解释的行为。让我们看一下这两个示例:
:
boolean var = false;
log.log( Level.WARNING, "Cant {0}", new Object[] { var } );
输出:Cant false
第二:
boolean var = false;
log.log( Level.WARNING, "Can't {0}", new Object[] { var } );
输出:不能{0}
为什么包含撇号(')会导致记录器不展开令牌?
无论您使用什么日志记录机制,似乎都是在内部使用MessageFormat
类。如果是这样,则需要转义撇号字符,因为它是单引号字符。单引号字符用于引用不需要解释的文本。
MessageFormat javadocs:
在String中,一对单引号可以用来引用除单引号以外的任意字符。例如,模式字符串"'{0}'"代表字符串"{0}",而不是FormatElement。单引号本身必须用在整个字符串中用双单引号" 表示。
(强调我的)
试
log.log( Level.WARNING, "Can''t {0}", new Object[] { var } );
这个代码:
MessageFormat mf = new MessageFormat("Can''t {0}");
System.out.println(mf.format(new Object[] {false}));
产生如下输出:
Can't false
{
和}
也是潜在的问题。这就是为什么NetBeans IDE提示在日志消息中使用消息格式时会转义这些字符。
log.log(Level.WARNING, "Can''t {0}", new Object[] {var});
你可以尝试更简单更易读的
log.log(Level.WARNING, "Can’t {0}", new Object[] {var});
或者直接以
开头log.log(Level.WARNING, "Cannot {0}", new Object[] {var});