You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:23:13