URL解码:Java中的UnsupportedEncodingException

时间:2011-05-17 11:24:17

标签: java encoding

我从文档中理解的是,如果我指定错误的编码作为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块中做任何事情?或者,如果我的理解完全错误,请告诉我。

4 个答案:

答案 0 :(得分:49)

除非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(在这种情况下你没有......)或规格可能会改变(在这种情况下它们不会......)< / p>

答案 1 :(得分:14)

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

我通常做如下:

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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

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

Java 11 现在具有不会抛出的 URLDecoder.decode(String, Charset);。所以你根本不需要使用 try-catch 块。就这样做:

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