среда, октября 23, 2013

Апострофы в сообщениях для java.util.logging.Logger

Всем привет. Расскажу о немного странной на первый взгляд проблеме. Как известно, класс Logger кроме всего остального имеет метод log с сигнатурой

public void log(Level level,
                String msg,
                Object[] params)

По названию поста можно догадаться кто виноват и что делать, но если нет, то прошу под кат.


Пользоваться метод очень просто:

String fileName = "fileName.txt";
String dirName = ...;

logger.log(Level.WARNING, "File {0} does not exist in directory {1}", new Object[]{fileName, dirName});

Цифры в фигурных скобках - это параметры, котороые поочереди выбираются из массива Object. В этом случае метод работает как и ожидалось. На место параметров попадают значение имени файла и директории.

Но, предположим, вы решили использовать сокращенный вариант английского отрицания:

logger.log(Level.WARNING, "File {0} doesn't exist in directory {1}", new Object[]{fileName, dirName});

Тут вас ждет небольшой сюрприз. В логе вы увидите вот что:

File fileName.txt doesn't exist in directory {1}.

То есть первый параметр был заменен на нулевой элемент массива Object, а второй нет. Дело в том, что метод log передает текст сообщения в класс java.text.MessageFormat, который по всей видимости требует экранирования спец-символов, к числу которых относится апостроф (одиночная кавычка).

"File {0} doesn''t exist in directory {1}"


Комментариев нет:

Отправить комментарий