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