Подтвердить что ты не робот

Возможно ли исключение Java UTF-8 Charset?

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

4b9b3361

Ответ 1

Как отметил Макдауэлл в комментарии к templatetypdef answer: если вы используете объект Charset при создании нового String вместо передачи имени charset, вам не нужно иметь дело с 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);

Ответ 2

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

Ответ 3

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

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

Изменить (2014-04):

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

Ответ 4

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

Ответ 5

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

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