なんじゃくにっき

プログラミングの話題中心。

java.net.URLをURLの妥当性検証に使ってはいけない

import java.net.URL
import java.net.URI
 
// 末尾スペース入りの間違ったURL
val url = new URL("http://example.com ")
 
とするとjava.net.MalformedURLExceptionが投げられると期待していたが投げられない。
 
java.net.URLはURLに含まれてはいけないいくつかの特殊文字が含まれている場合に、
例外を投げずにスルーしてしまう。
  
代わりに
val uri = new URI("http://example.com ")
 
とするとjava.lang.IllegalArgumentExceptionが投げられる。
 
じゃあURIならいいのかって言うと・・
  
val uri = new URI("http:./hoge")
 
みたいなありえないドメインに属するURLでも例外が投げられない。
ここで
uri.getHost()
とするとnullが返る。
 
結局、URLにせよ、URIにせよ、インスタンスの作成に成功しても中身が正しいとは限らない。
org.apache.commons.validator.UrlValidator
みたいにURL文字列を正規表現でvalidateしないとダメですね。
 
 
※11/2追記