Может ли Java возможно бросить UnsupportedEncodingException
при использовании "UTF-8"
кодирования, или я могу безопасно подавить его метание?
Возможно ли исключение Java UTF-8 Charset?
Ответ 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 недоступен. И это почти ничего не стоит делать... тем более, что вам нужно "сделать что-то" с исходным исключением.