Class.getResource 與 ClassLoader.getResource 路徑差異詳解讀取類路徑下資源時,常見兩種方式,路徑前綴「/」的含義截然不同,搞混極易導致 NullPointerException。
System.out.println("path:" + Resources.class.getResource("/"));
System.out.println("path:" + Resources.class.getResource(""));
path:file:/home/xiaosi/Study/lectures/target/classes/ path:file:/home/xiaosi/Study/lectures/target/classes/com/qunar/lectures/
前者指向 classpath 根,後者指向當前類包目錄。
null。System.out.println(r.getClass().getClassLoader().getResource(""));
System.out.println(r.getClass().getClassLoader().getResource("/")); // null
file:/home/xiaosi/Study/lectures/target/classes/ null
| 方法 | 相對路徑起點 | 是否允許以「/」開頭 |
|---|---|---|
Class.getResource | 當前類所在包 | 允許,表示 classpath 根 |
ClassLoader.getResource | classpath 根 | 不允許,會返回 null |
ClassLoader.getResource("config/xxx.xml"),路徑不加「/」,從 classpath 根開始,清晰一致。this.getClass().getResource("/config/xxx.xml"),明確以「/」開頭表示從根查找。