記事の内容は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にはならないはず