Java日志记录器-符号撇号问题



我对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});

最新更新