Java UTF-8字符集异常是否可能?

Java UTF-8字符集异常是否可能?,java,exception,utf-8,character-encoding,Java,Exception,Utf 8,Character Encoding,当使用“UTF-8”编码时,Java是否可能抛出不支持的编码异常,或者我可以安全地抑制它的抛出?根据,每个Java实现都必须支持UTF-8以及一些其他字符集。因此,我认为您可以安全地抑制异常;除非您有一个不兼容的Java实现,否则这应该不会失败。它应该出现在每个Java运行时中,因此如果缺少运行时异常,则重新抛出它是合理的。不过,我不会称之为“压制”。对我来说,压制意味着抓住异常并假装它没有发生;如果编码丢失,不确定如何继续。这取决于“安全”和“抑制”的含义 我很想捕获异常并抛出一个未检查的异常

当使用
“UTF-8”
编码时,Java是否可能抛出
不支持的编码异常
,或者我可以安全地抑制它的抛出?

根据,每个Java实现都必须支持UTF-8以及一些其他字符集。因此,我认为您可以安全地抑制异常;除非您有一个不兼容的Java实现,否则这应该不会失败。

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

这取决于“安全”和“抑制”的含义


我很想捕获异常并抛出一个未检查的异常(或
AssertionError
)。您的应用程序可能永远不会遇到这种情况。但是谁知道呢。。。有人可能在UTF-8不可用的非一致性平台上运行它。而且做这件事几乎不花什么钱。。。尤其是因为您必须对原始异常“做点什么”。

正如McDowell在对的评论中所指出的:如果您在实例化新的
字符串时使用
字符集
对象,而不是传递字符集的名称,您不必处理
不支持的编码异常
或任何其他选中的异常:

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"));
这是Java标准库中的一个不一致性,我们不得不接受它

请注意,
Charset.forName(…)
可以引发异常(
IllegalCharsetNameException
IllegalArgumentException
UnsupportedCharsetException
),但这些都是未经检查的异常,因此您不必亲自捕获或重新引发它们

edit-自Java 7以来,有一个类
Java.nio.charset.StandardCharsets
,它具有用于常用字符编码的常量。例如:

String s3 = new String(bytes, StandardCharsets.UTF_8);

最简单的方法是创建UTF-8字符集常量。这样,您就不必一次又一次地捕获不支持的DencodingException:

public class Charsets {
    public static final Charset UTF_8 = Charset.forName("UTF-8");
}
编辑(2014-04):


使用Java7,您不必创建自己的常量。您只需使用即可。

我使用了下面这行代码,它对我很有用

旧代码 byte[]hash=digest.digest(input.getBytes(“UFT-8”)

更新代码
byte[]hash=digest.digest(input.getBytes(StandardCharsets.UTF_8))

此外,如果您可以使用
字符集
类而不是直接字符串文本,则不需要处理
不支持的编码异常
。这非常明智。Oracle应该为所有JVM保证的字符集向Charset类添加这样的常量。编辑:没关系,我看到他们终于在Java7中做到了。