Java UTF-8 Charset异常可能吗?

Ale*_*rov 16 java exception utf-8 character-encoding

Java可能会UnsupportedEncodingException在使用"UTF-8"编码时抛出,或者我可以安全地抑制它的抛出?

Jes*_*per 28

正如McDowell在对templatetypdef的回答的评论中指出的那样:如果Charset在实例化new时使用对象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"));
Run Code Online (Sandbox Code Playgroud)

这是Java标准库中的一个不一致之处,我们不得不忍受......

请注意,Charset.forName(...)可以抛出异常(IllegalCharsetNameException,IllegalArgumentException,UnsupportedCharsetException),但这些都是unchecked异常,所以你不必赶上或自己重新扔.

编辑 - 从Java 7开始,这个类java.nio.charset.StandardCharsets具有常用字符编码的常量.例:

String s3 = new String(bytes, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)


tem*_*def 13

根据Javadoc的Charset说法,每个Java实现都必须支持UTF-8以及其他一些字符集.因此,我认为你可以安全地压制异常; 除非你有一个不合规的Java实现,否则这应该不会失败.

  • 此外,如果您可以使用`Charset`类而不是直字符串文字,则不需要处理`UnsupportedEncodingException`. (7认同)

Rob*_*ert 8

最简单的方法是创建一个UTF-8字符集常量.然后,您不必一次又一次地捕获UnsupportedEncodingException:

public class Charsets {
    public static final Charset UTF_8 = Charset.forName("UTF-8");
}
Run Code Online (Sandbox Code Playgroud)

编辑(2014-04):

使用Java 7,您不必创建自己的常量.您只需使用StandardCharsets .UTF_8即可.


eri*_*son 6

它应该存在于每个Java运行时中,因此如果缺少运行时异常,则重新抛出它是合理的.不过,我不会称之为"压抑".对我来说,压制意味着捕捉异常并假装它没有发生; 如果编码丢失,不确定如何继续.


Ste*_*n C 5

这取决于你所说的"安全"和"压制".

我很想捕获异常并AssertionError在其位置抛出未经检查的异常(或).您的应用程序可能永远不会遇到此问题.但是谁知道......有人可能会在一些不符合UTF-8的不符合要求的平台上运行它.这样做几乎没有任何成本......尤其是因为你必须对原始异常"做某事".