繁体   English   中英

永远不会抛出UnsupportedEncodingException

[英]UnsupportedEncodingException is never thrown

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

这是我的确切构造。 myCharacterData由外部程序提供,它只是一个字符串,但是该字符串可能包含垃圾数据(因为我无法控制要放入的数据)。

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

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

您误解了UnsupportedEncodingException的来源。

它由采用字符集名称作为String的方法抛出。 例如, String.getBytes(String)引发异常。

抛出它的原因是,如果JVM不知道该名称所指向的字符集。 例如,如果您调用"".getBytes("flibbly bibbly") ,则(几乎可以肯定)将引发异常,因为这不是已知字符集的名称。

请注意,这与字符串的内容无关。 不管是好是坏(我说是更糟),Java在向/从字节编码或解码字符时不会抛出异常。

例如, "🍕"不能在ISO-8859-1中表示; 但是您可以要求它的字节数,然后得到[63] ,即与"?"相同

同样, [0xff]在UTF-8中不是有效的字节序列,但是new String(new byte[]{(byte)0xff}, "UTF-8")产生" " 在任何情况下都不会引发异常。

Ideone演示

String.getBytes()String.getBytes(Charset)没有声明抛出异常。 这是因为调用这些之前您已经具有一个Charset实例:

  • 在前一种情况下,因为它使用JVM默认字符集-如果不存在,则无法启动JVM!
  • 在后一种情况下。 因为您已经从Charset.forName(String)获得了字符集。 该方法引发异常。 但是一旦获得了结果,就无需再次“查找”字符集,因此它就不可能变为“未知”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM