2013-03-18 51 views
2
java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 

拋出java.net.URI.create例外

java.net.URISyntaxException: 
Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 

雖然

new java.net.URL("http://adserver.adtech.de/adlink|3.0") 

的作品就好了。

更新1

雖然

new org.apache.commons.httpclient.URI("http://adserver.adtech.de/adlink|3.0") 

也完美的作品。

是什麼原因?

+0

使用URLEncoder.encode,你可以看到http://stackoverflow.com/questions/4992317/illegal-character-in-path-at-index-16 – user1929959 2013-03-18 21:42:53

+1

是的,但問題是爲什麼它適用於' java.net.URL'而不是'java.net.URI'? – Archer 2013-03-18 21:46:36

+0

無法重現。 'URI.create()'和'new URI()'都會拋出異常。在URI.create()的情況下,它按照Javadoc包裝在一個'IllegalArgumentException'中。 Java版本1.7.0_17。 – EJP 2013-03-18 23:27:09

回答

6

接受單個String參數的URI的構造函數要求您遵循RFC 2396爲URI定義的嚴格語法規則。根據這些規則,|應編碼爲%7C。其他的構造可以編碼的URI組件給你,所以例如這不會拋出異常:

new java.net.URI("http", "//adserver.adtech.de/adlink|3.0", null); 

在其他URL類不強制URI語法規則。事實上,您有責任編碼應該編碼的組件; URL類不會幫助你。從the documentation

這是調用者的責任,編碼任何領域,它需要被調用URL之前逃了出來,並解碼任何逃脫的字段時,從URL返回。