Codename One安卓构建资源加载失败,报NullPointerException求助
Codename One安卓构建NullPointerException问题解决
问题分析
模拟器运行正常但安卓构建抛出java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.BufferedReader.close()' on a null object reference,核心原因有两点:
- 资源加载失败时输入流为null,手动调用
close()触发空指针 - 安卓平台对资源路径、打包规则的处理和模拟器存在差异
解决方案
1. 安全处理输入流关闭
改用Java的try-with-resources语法,它会自动关闭资源,无需手动调用close(),同时避免空指针问题。修正后的代码:
public static final String DUCKY_ATLAS = "/duckySprite.png"; public static final String LEVEL_ATLAS = "/mapSprite.png"; public static final String START_LEVEL = "/levelOne.png"; public static final String OBSTACLE_SEQUENCES = "/levelSequences.png"; // 安全加载图像资源的方法 public static Image getSpriteAtlas(String file) { Image img = null; // try-with-resources自动关闭InputStream try (InputStream is = CN.getResourceAsStream(file)) { if (is != null) { img = Image.createImage(is); } else { System.err.println("资源未找到:" + file); } } catch (IOException e) { e.printStackTrace(); } return img; }
2. 验证资源打包配置
- 确认
/common/src/main/resources下的图片文件在安卓构建时被正确复制到assets目录。可以通过查看构建后的安卓项目(build/android目录),检查assets文件夹中是否存在这些图片。 - 若资源未被打包,检查Codename One的构建配置,确保
resources目录被标记为资源根目录,构建脚本会自动复制其中的文件。
3. 调整资源路径写法
安卓平台对资源路径的解析可能和模拟器不同,尝试去掉路径开头的斜杠,比如将"/duckySprite.png"改为"duckySprite.png",再测试安卓构建是否正常。
内容的提问来源于stack exchange,提问作者Stefan Cohn
相关产品推荐
相关产品推荐

