今日在协助同学处理程序异常时,碰到getResource方法特殊问题,在本机Java8环境正常运行代码,移植到同学Java11环境上处理报NullPointException,代码如下
image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));
image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));
image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));
开始以为是getDefaultToolkit方法返回的值有误,但检查代码未发现问题,进行debug后发现NullPointException来自getImage方法,原因是传入的路径为空,因此问题主要是由于getResource方法在Java8与Java11上的实现不同导致。
我们知道,getResource接受一个字符串参数,如果以”/”开头,就在classpath根目录下找(不会递归查找子目录),如果不以”/”开头,就在调用getResource的class文件所在目录下找(同样不会递归查找子目录),这些是在Java8中正常使用的内容,但在Java11中,该方法显著产生了区别。因此我远程控制同学电脑,通过对比源码确认与debug确认原因。
以下为Java11 getResource方法实现内容