从String.getBytes(“UTF-8”)处理UnsupportedEncodingException的推荐方法

时间:2012-05-25 04:22:38

标签: java string character-encoding

在库方法中调用String.getBytes(“UTF-8”)时,建议处理UnsupportedEncodingException 的方法是什么?

如果我正确阅读http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html,UTF-8编码总是可用,这让我相信没有理由将此例外传递给图书馆的消费者(即是,在方法签名中添加throws子句。似乎任何使UTF-8编码工具不可用的故障模式都是灾难性的,导致我编写这个处理程序:

    try
    {
        ....
        return "blah".getBytes("UTF-8");
    }
    catch (UnsupportedEncodingException e)
    {
        // we're assuming UTF-8 encoding is always available.
        // see
        // http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html
        e.printStackTrace();
        return null; //prevent compile-time "method must return a result" errors
    }

是否存在此代码段无法解决的故障模式?

3 个答案:

答案 0 :(得分:45)

你知道我在做什么吗?

return "blah".getBytes( Charset.forName( "UTF-8" ) );

这个不会抛出一个经过检查的异常。

更新:自Java 1.7以来,我们有StandardCharsets

return "blah".getBytes( StandardCharsets.UTF_8 );

答案 1 :(得分:2)

我试图弄清楚UTF-8是否始终可用时遇到了这个问题。谢谢你的链接。

我同意在使用保证可用的特定字符集进行编码和解码时,不需要抛出已检查异常。如果字符集是传入的变量,我可能会抛出UnsupportedEncodingException。

这就是我在类似Android代码中所做的事情:

public static String encode(String input) {
    try {
        return URLEncoder.encode(input, CharEncoding.UTF_8);
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e);
    }
}

CharEncoding.UTF_8只是Apache Commons的“UTF-8”字符串常量。

Judge Mental建议使用StandardCharsets.UTF_8的建议非常棒,但对于我们这些进行Android开发的人来说,它仅适用于SDK 19(KitKat)及以上版本。

答案 2 :(得分:1)

如果您使用 Lombok,可以使用 @SneakyThrows 注释来避免这种情况。

来自 Lombok 文档:

"@SneakyThrows 可用于偷偷地抛出已检查的异常,而无需在方法的 throws 子句中实际声明。

  • “不可能”的例外。例如, new String(someByteArray, "UTF-8");声明它可以抛出 UnsupportedEncodingException 但根据 JVM 规范,UTF-8 必须始终可用。当您使用 String 对象时,这里的 UnsupportedEncodingException 与 ClassNotFoundError 的可能性差不多,而且您也没有捕捉到它们! "

https://projectlombok.org/features/SneakyThrows