URLEncoder.encode调用为何无法触发UnsupportedEncodingException
调用URLEncoder.encode未触发UnsupportedEncodingException的原因
UnsupportedEncodingException的触发条件和待编码的字符串内容完全无关,只有当传入的第二个参数(指定的编码名称)不被当前JVM识别支持时,才会抛出这个异常。你测试时调整的都是待编码的原始内容(比如各类特殊字符、符号),根本碰不到异常触发的逻辑,自然无法进入catch分支。- 你代码里写死传入的编码参数是
"UTF-8",这是Java规范强制要求所有标准JVM实现必须内置支持的字符集,不存在不支持的情况,当然不会抛出对应异常。
触发该异常的方法
只要传入一个JVM不识别的非法编码名称,就能正常进入catch分支,示例:
try { // 传入随意编造的不存在的编码名,即可触发异常 return URLEncoder.encode("!@#", "FAKE_INVALID_CHARSET"); } catch (UnsupportedEncodingException e) { System.out.println("exeption:"+e.toString()); }
实用编码建议
- 如果你用的是JDK10及以上版本,优先用
URLEncoder.encode(String s, Charset charset)重载方法,直接传StandardCharsets.UTF_8作为参数即可。这个重载方法不需要手动捕获UnsupportedEncodingException,因为传入的Charset对象本身就是JVM确认支持的实例,从API层面就规避了这个不必要的受检异常。 - Java规范强制要求所有标准JVM必须支持的字符集包括
US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16,传入这些编码名称时,永远不会触发该异常。
内容的提问来源于stack exchange,提问作者sajeeth
相关产品推荐
相关产品推荐

