【问题标题】:Recommended method for handling UnsupportedEncodingException from String.getBytes("UTF-8")处理来自 String.getBytes("UTF-8") 的 UnsupportedEncodingException 的推荐方法
【发布时间】:2012-05-31 16:24:12
【问题描述】:

在库方法中调用 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
    }

是否存在此 sn-p 无法解决的故障模式?

【问题讨论】:

  • 这个问题不是重复的,因为它应该是重复的问题涉及 URL 编码/解码。我投票重新开放。

标签: java string character-encoding


【解决方案1】:

你知道我是做什么的吗?

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

这个不会抛出检查异常。

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

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

【讨论】:

  • +1 完全避免了这个问题。 :) 将其标记为答案似乎并不完全正确,但是...
  • 这似乎是最好的解决方案。 Charset.forName 抛出一个未经检查的异常,这是 UnsupportedEncodingException 应该开始的。
【解决方案2】:

我在尝试确定 UTF-8 是否始终可用时遇到了这个问题。所以谢谢你的链接。

我同意,在使用保证可用的特定字符集进行编码和解码时,无需抛出 checked 异常。如果字符集是传入的变量,我可能会抛出 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) 及更高版本。

【讨论】:

  • 如果 StandardCharsets 不可用,没有什么可以阻止您编写自己的 MyStandardCharsets 类,其中一些 public static final Charsets 使用 Charset.forName 初始化。
【解决方案3】:

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

来自 Lombok 文档:

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

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

https://projectlombok.org/features/SneakyThrows

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 2014-05-16
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多