因此,我尝试使用字符串中的getBytes,而且我读到,如果它碰到一个字符,它将无法转换为真实数据,它将引发UnsupportedEncodingException。我添加了java.io来提供异常,但是当我将其放入try catch语句中时,我得到了, “ UnsupportedEncodingException的无法到达的catch块。永远不会从try语句主体中引发此异常”
这是我的确切结构。 myCharacterData由外部程序提供,它只是一个字符串,但是很有可能字符串可以容纳垃圾数据(因为我无法控制其中的内容)。
byte[] bytes = {0x40};
try {
bytes = myCharacterData.getBytes();
} catch (UnsupportedEncodingException saveError) {};
我错了吗?可以不抛出该异常吗?在这里使用的正确的例外是什么?
答案 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")
产生"�"
。在任何情况下都不会引发异常。
String.getBytes()
或String.getBytes(Charset)
都没有声明抛出异常。这是因为调用这些命令之前,您已经有一个Charset
实例:
Charset.forName(String)
。该方法引发异常。但是一旦获得了结果,就无需再次“查找”字符集,因此它就不可能变成“未知”。