作为一个java初学者,最近在学习尚学堂免费的基础java课程时,跟着视频做一个planewar/飞机大战的程序,遇到了背景和飞机图片加载不了的问题,几经搜索,终于解决,分享一下过程和解决办法:
代码片段如下,使用Gameutil.class.getClassLoader().getResource获得图片文件的路径url,利用ImageIO.read读取图片文件:
private GameUtil(){}public static Image getImage(String path){BufferedImage bi = null;try {URL u = GameUtil.class.getClassLoader().getResource(path);bi = ImageIO.read(u);} catch (IOException e) {e.printStackTrace();}return bi;}public static void main(String[] args) {Image pl = GameUtil.getImage("images/plane.png");System.out.println(pl);}
然而最终打印出来的Image对象 pl 却是 null。
上网查了很多做这个小项目的文章,有一些人也遇到了加载不了图片的问题,但跟我的问题不同。他们是报错 input==null,这种问题一般是路径错误,有的是getImage()里的相对路径填的不准确,少打或多打了 / ,或者图片素材放置的路径不对,有遇到这种问题的朋友,具体解决方法可以参考
:https://blog.csdn.net/qq_41930618/article/details/104207418
而我参考他的测试思路,运行以下代码,结果见注释
public static void main(String[] args) {Image pl = GameUtil.getImage("images/plane.png");System.out.println(pl);
//nullSystem.out.println(GameUtil.class.getClassLoader().getResource(""));
//file:/D:/JAVA%20project/PlaneWar/out/production/PlaneWar1.0System.out.println(GameUtil.class.getClassLoader().getResource("images/plane.png"));//file:/D:/JAVA%20project/PlaneWar/out/production/PlaneWar1.0/images/plane.png}
可以发现,路径是没有错误的,还找到了文件,Gameutil.class.getClassLoader().getResource这一步没有问题,但pl就是null,问题出在getImage()方法里的ImageIO.read()这一步。在上网搜索相关问题,终于找到了问题所在,有点出乎意料,原来是图片格式的小问题...
我的图片素材是在csdn上以下博客下载的,在这里感谢他的分享,给我很大方便:
https://blog.csdn.net/quanquanya/article/details/104870752?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168087736416782427468602%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168087736416782427468602&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-104870752-null-null.142^v82^control,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=%E5%B0%9A%E5%AD%A6%E5%A0%82%E9%A3%9E%E6%9C%BA%E5%A4%A7%E6%88%98&spm=1018.2226.3001.4187
博客里分享链接是简书的页面,图片打开原图另存为是webp文件,我选择把后缀改为png和jpg使用。但实际上webp文件并不是改了后缀真实文件类型就变了,文件其实还是wepb文件,用记事本打开图片文件可以看到开头的webp字段。而ImageIO.read()方法是无法读取webp文件的,会返回null。这一部分我是在以下博客学习到的:
ImageIo.read() 读取图片时返回Null的解决方法_Apoca_lypse的博客-CSDN博客
但它提供的解决方法我没有使用,觉得为这一个简单小项目再引入jar有些麻烦,好在只有两张图片,我使用了一个方便的笨办法,把图片素材文件用windows系统自带的画图打开,直接另存为png、jpg格式就好了,在用记事本打开新文件可以发现webp字段不见了,文件类型确实改变了,程序也能正常运行了,不再返回null了。
把这个小问题的两种解决办法分享给跟我一样的初学者们,主要寻找问题所在的方式思路可以借鉴。作为初学者,学艺不精,文章可能多有谬误,还请大家指正。