Возможно ли исключение Java UTF-8 Charset? - PullRequest
14 голосов
/ 19 февраля 2011

Может ли Java генерировать UnsupportedEncodingException при использовании кодировки "UTF-8", или я могу смело подавлять его?

Ответы [ 5 ]

25 голосов
/ 19 февраля 2011

Как отметил Макдауэлл в комментарии к ответ templatetypdef : если вы используете объект Charset при создании нового String вместо передачи имени кодировки, вам не нужноиметь дело с UnsupportedEncodingException или любым другим проверенным исключением:

byte[] bytes = ...;

// Requires you to handle UnsupportedEncodingException
String s1 = new String(bytes, "UTF-8");

// Doesn't require you to handle any checked exceptions
String s2 = new String(bytes, Charset.forName("UTF-8"));

Это несоответствие в стандартной библиотеке Java, с которой нам приходится жить ...

Обратите внимание, что Charset.forName(...) может выдатьисключения (IllegalCharsetNameException, IllegalArgumentException, UnsupportedCharsetException), но все они являются непроверенными исключениями, поэтому вам не нужно ловить или перебрасывать их самостоятельно.

edit - Начиная с Java 7 существует класс java.nio.charset.StandardCharsets, который имеет константы для часто используемых кодировок символов.Пример:

String s3 = new String(bytes, StandardCharsets.UTF_8);
13 голосов
/ 19 февраля 2011

Согласно Javadoc для Charset, каждая реализация Java должна поддерживать UTF-8 вместе с несколькими другими кодировками.Поэтому, я думаю, вы можете смело подавить исключение;если у вас нет несовместимой реализации Java, это не может привести к сбою.

8 голосов
/ 19 февраля 2011

Самый простой способ - создать константу кодировки UTF-8. Тогда вам не нужно снова и снова перехватывать UnsupportedEncodingException:

public class Charsets {
    public static final Charset UTF_8 = Charset.forName("UTF-8");
}

Редактировать (2014-04):

С Java 7 вам не нужно создавать свою собственную константу. Вы можете просто использовать StandardCharsets.UTF_8.

6 голосов
/ 19 февраля 2011

Предполагается, что он присутствует в каждой среде выполнения Java, поэтому разумно перезапустить исключение среды выполнения, если оно отсутствует. Я бы не назвал это «подавлением». Для меня подавить означает поймать исключение и сделать вид, что оно не произошло; не знаю, как поступить, если кодировка отсутствует.

5 голосов
/ 19 февраля 2011

Это зависит от того, что вы подразумеваете под «безопасным» и «подавляющим».

Я бы соблазнился поймать исключение и бросить на его место непроверенное исключение (или AssertionError). Скорее всего, ваше приложение никогда не столкнется с этим. Но кто знает ... кто-то может запустить его на какой-то несовместимой платформе, в которой UTF-8 не был доступен. И это почти ничего не стоит ... тем более, что вы должны что-то делать с оригинальным исключением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...