Edited at

java.net.URL#getPathの気になるところを調べた

More than 1 year has passed since last update.

記事の内容はJava8で検証しています。


概要

getPath()で得られる文字列での'/'の扱いがどうなっているのか、コード書くたびにドキドキするのでメモ。


まとめ


  • パスが完全に省略されていても、'/'だけは返される


    • ただしhostとpathの両方が存在しない場合、空文字列が返る



  • 末尾の'/'は省略されない


    • そもそも省略されるべきではないので指摘すべきでもないが




URL
getPath()

http://host
/

http://host/
/

http://host/path
/path

http://host/path/
/path/

http://host?query
/

http://host/?query
/

http://host/path?query
/path

http://host/path/?query
/path/

http://
(空文字列)

http:///
/

http:///path
/path


留意すべき点


  • '/'で始まることが保証されるので、次のような記述は問題ない

path.startsWith("/path");


  • '/'で始まることが保証されるので、split("/")で要素を切り出すと最初の要素は必ず空文字列になる…読み飛ばす必要がある


    • ただし"/"だけのパスの場合、split("/")はサイズ0の配列を返すことに要注意



String a[]=path.split("/");

if(a[1].equals("path")) {} //パスが"/"の場合に例外発生


  • 末尾の'/'は省略されないので、次のような記述は注意が必要

path.endsWith("tail"); //"/path/tail/"だった場合には偽となる


  • getPath()がnullを返すことはたぶんない


    • コンストラクタにURL文字列を渡してインスタンスを生成する分にはnullにはならないはず