【问题标题】:URL decoding: UnsupportedEncodingException in JavaURL 解码:Java 中的 UnsupportedEncodingException
【发布时间】:2011-05-17 11:24:16
【问题描述】:

我从文档中了解到,只有当我将错误的编码指定为 URLDecoder.decode(String, String) 方法的第二个参数时,才能抛出 UnsupportedEncodingException。是这样吗?我需要知道可以抛出此异常的情况。

基本上,我的一个函数中有这个代码段:

if (keyVal.length == 2) {
    try {
        value = URLDecoder.decode(
            keyVal[1],
            "UTF-8");
    } catch (UnsupportedEncodingException e) {
          // Will it ever be thrown?
    }
}

既然我明确提到“UTF-8”,有什么办法可以抛出这个异常?我需要在 catch 块中做任何事情吗?或者,如果我的理解完全错误,请告诉我。

【问题讨论】:

    标签: java encoding


    【解决方案1】:

    这不可能发生,除非您的 JVM 中存在根本性的问题。但我认为你应该这样写:

    try {
        value = URLDecoder.decode(keyVal[1], "UTF-8");
    } catch (UnsupportedEncodingException e) {
        throw new AssertionError("UTF-8 is unknown");
        // or 'throw new AssertionError("Impossible things are happening today. " +
        //                              "Consider buying a lottery ticket!!");'
    }
    

    这样做的代价是一些“永远”不会执行的代码字节,以及一个永远不会使用的字符串文字。为了防止您可能误读/误解了javadocs(在这种情况下您没有......)或规格可能会改变(在这种情况下它们不会......)

    【讨论】:

    • JVM 可能会被破坏的实际例子有哪些?
    • @Pacerier - 我想不出来。您可能需要修改“rt.jar”文件(或更糟)才能打破这一点。所以它理论上是可能的......但除非您正在创建/使用实验性 JVM,否则您可能会遇到这种情况。
    • 检查这个异常有什么原因吗?
    • 大概是因为设计者认为这是一个典型应用程序应该处理的错误情况。 (事后看来,这可能是一个错误,但如果不破坏二进制兼容性就无法修复。)
    • 另一个问题是只有“UTF-8”才能保证不会抛出异常。对于其他编码名称......异常是可能的,并且检查异常是一个合理的决定。也许解决方案是添加一个根本不抛出异常的URLDecoder.decodeUTF8( 方法。
    【解决方案2】:

    这是因为选中 UnsupportedEncodingException 的奇怪选择。不,它不会被抛出。

    我通常这样做:

    } catch (UnsupportedEncodingException e) {
      throw new AssertionError("UTF-8 not supported");
    }
    

    【讨论】:

      【解决方案3】:

      在您的特殊情况下 - 不,它不会被抛出。除非您在不支持“UTF-8”的 Java 运行时中执行代码。

      【讨论】:

      • 这样的运行时不应该存在——至少在 JDK 1.6 中,UTF-8 是标准字符集。 download.oracle.com/javase/6/docs/api/java/nio/charset/…
      • @Mat - 我也相信这一点,但是 .. Oracle 并不是 Java 运行时的唯一供应商。 Java 语言规范没有提到任何必须支持的编码(除了:UTF-16,它是char 的指定编码)
      • 哇,谢谢。我认为确实如此,并且 javadoc 似乎暗示了这一点,但你是对的,这不在 JLS 中。
      • @Andreas_D:虽然 JLS 没有指定编码,但 Mat 链接的 javadocs 也是一个规范,并且是规范的。因此,任何经过认证的 Java 实现都必须在提供的 Java 核心 API 实现中支持 UTF-8。
      • javadocs 是否规范?你有那个声明的参考吗?老实说,我不认为必须实现 JLS 所有 javaDoc 细节(哪个版本,顺便说一句?)才能获得证书。
      【解决方案4】:

      为新读者回答一个老问题:

      Java 11 现在有 URLDecoder.decode(String, Charset); 不会抛出异常。因此,您根本不必使用 try-catch 块。做吧:

      URLDecoder.decode(keyVal[1], StandardCharsets.UTF_8);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        • 2012-08-29
        • 2011-09-25
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多