Windows7 Eclipse开发的Java程序迁移至ChromeBook Ubuntu后纹理加载失败
解决Java纹理加载失败(
input == null!)的问题 嗨,作为Java新手遇到这种路径问题真的太正常了,别慌,咱们一步步来搞定它:
核心问题:你用错了getResource()的用法
你现在代码里的Texture.class.getResource(filename)是用来从**类路径(Classpath)**里加载资源的,不是直接读取系统的绝对路径。你传了/home/chronos/Desktop/ThreeD/3d/res/textures/floor.png这种系统绝对路径,它根本不会这么去查找,所以返回了null,才导致ImageIO报那个错。
步骤1:把资源文件夹配置成类路径资源
首先得让你的res文件夹变成项目的"资源目录",这样编译后里面的文件会自动被放到类路径里:
- 在Ubuntu的IDE里(不管是Eclipse还是其他工具),右键你的项目 → Properties → Java Build Path → Source标签页
- 点击「Add Folder」,选中你的
res文件夹(也就是/home/chronos/Desktop/ThreeD/3d/res),把它添加为源文件夹 - 这样编译后,
res里的所有文件都会被复制到类路径的根目录下
步骤2:修改代码里的路径为相对路径
现在你就可以用类路径的相对路径来访问纹理了,比如你的floor.png在res/textures/下面,路径就写成/textures/floor.png(开头的斜杠代表类路径的根目录):
package com.Three.ThreeD.graphics; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; public class Texture { // 改成类路径相对路径 public static Render floor = loadBitmap("/textures/floor.png"); public static Render loadBitmap(String filename) { try { BufferedImage image = ImageIO.read(Texture.class.getResource(filename)); int width = image.getWidth(); int height = image.getHeight(); Render result = new Render(width, height); image.getRGB(0, 0, width, height,result.pixels, 0,width); return result; } catch (Exception e) { System.out.println("纹理文件找不到或者加载失败!"); throw new RuntimeException(e); } } }
步骤3:注意Ubuntu的大小写敏感!
Windows系统不区分文件名大小写,但Ubuntu是严格区分的!比如你代码里写的是floor.png,如果实际文件是Floor.png或者FLOOR.PNG,系统就会找不到,一定要检查文件名和路径的大小写完全一致。
应急备选方案:直接读取绝对路径(不推荐)
如果暂时不想配置类路径,也可以直接用File类读取系统绝对路径,这样就不用依赖类路径了:
// 替换loadBitmap方法里的ImageIO.read那一行 BufferedImage image = ImageIO.read(new File(filename));
不过这种方法通用性很差,换台电脑路径就得改,还是优先用类路径的方法哦。
最后再检查一遍
- 确认
res/textures/floor.png确实存在,路径没有拼写错误 - 确认IDE已经把
res文件夹设为源文件夹,编译后能在输出目录里看到textures文件夹和图片
这样应该就能顺利加载纹理啦!
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

