UnsupportedEncodingException никогда не выбрасывается - PullRequest
0 голосов
/ 24 января 2019

Итак, я пытаюсь использовать getBytes из строки, и я прочитал, что если он попадет в символ, он не сможет превратиться в реальные данные, он выдаст исключение UnsupportedEncodingException. Я добавил java.io для предоставления исключения, но когда я помещаю его в оператор try catch, я получаю «Недоступный блок перехвата для UnsupportedEncodingException. Это исключение никогда не выдается из тела оператора try»

Вот моя точная конструкция. myCharacterData предоставляется внешней программой, и это просто строка, но очень возможно, что строка может содержать ненужные данные (так как я не контролирую, что в нее вставлено).

byte[] bytes = {0x40};
try {
    bytes = myCharacterData.getBytes();
} catch (UnsupportedEncodingException saveError) {};

Я не прав? Разве это исключение не может быть выброшено? Какое правильное исключение использовать здесь?

1 Ответ

0 голосов
/ 24 января 2019

Вы неправильно понимаете происхождение UnsupportedEncodingException.

Он генерируется методами, которые принимают имя кодировки в качестве строки. Например, String.getBytes(String) выдает исключение.

Причина, по которой он генерируется, заключается в том, что JVM не знает, к какой кодировке относится имя. Например, если вы вызвали "".getBytes("flibbly bibbly"), исключение (почти наверняка) будет сгенерировано, потому что это не имя известной кодировки.

Обратите внимание, что это не имеет никакого отношения к содержимому строки. К лучшему или к худшему (я говорю к худшему), Java не генерирует исключения при кодировании или декодировании символов в / из байтов.

Например, "?" нельзя представить в ISO-8859-1; но вы можете запросить его байты, и вы получите [63], то есть то же самое, что и "?".

Точно так же [0xff] не является допустимой последовательностью байтов в UTF-8, но new String(new byte[]{(byte)0xff}, "UTF-8") производит "�". Ни в том, ни в другом случае не выдается исключение.

( Ideone demo )

Исключение не объявляется как выбрасываемое String.getBytes() или String.getBytes(Charset). Это потому, что у вас уже есть экземпляр Charset до вызова этих:

  • В первом случае, поскольку он использует кодировку JVM по умолчанию - если ее не существует, JVM не сможет запуститься!
  • В последнем случае. Потому что вы уже получили кодировку, например от Charset.forName(String). Этот метод выдает исключение; но как только вы получите результат, вам больше не нужно «искать» кодировку, так что нет вероятности, что она станет «неизвестной».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...