永远不会抛出UnsupportedEncodingException

时间:2019-01-24 17:36:27

标签: java exception

因此,我尝试使用字符串中的getBytes,而且我读到,如果它碰到一个字符,它将无法转换为真实数据,它将引发UnsupportedEncodingException。我添加了java.io来提供异常,但是当我将其放入try catch语句中时,我得到了, “ UnsupportedEncodingException的无法到达的catch块。永远不会从try语句主体中引发此异常”

这是我的确切结构。 myCharacterData由外部程序提供,它只是一个字符串,但是很有可能字符串可以容纳垃圾数据(因为我无法控制其中的内容)。

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

我错了吗?可以不抛出该异常吗?在这里使用的正确的例外是什么?

1 个答案:

答案 0 :(得分:1)

您误解了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)。该方法引发异常。但是一旦获得了结果,就无需再次“查找”字符集,因此它就不可能变成“未知”。