处理不受支持的编码来自 String.getBytes(“UTF-8”) 的异常的推荐方法

2022-09-02 02:34:25

在库方法中调用 String.getBytes(“UTF-8”) 时,处理不受支持的编码异常的推荐方法是什么?

如果我没看错 http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html,UTF-8 编码应该始终可用,这让我相信没有理由将此异常传递给库的使用者(即,在方法签名中添加子句)。似乎任何使 UTF-8 编码工具不可用的故障模式都将是灾难性的,导致我编写此处理程序:throws

    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
    }

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


答案 1

你知道我是做什么的吗?

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

这个不会引发已检查的异常。

更新:从Java 1.7开始,我们有StandardCharsets

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

答案 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的建议很棒,但对于我们这些进行Android开发的人来说,它只能在SDK 19(KitKat)及以上版本上使用。StandardCharsets.UTF_8