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

复制数据库到FileSystemStorage时触发NullPointerException的原因排查

排查Util.copy抛出NullPointerException的思路

针对你遇到的问题,从以下几个方向逐一排查:

  • 确认输入流pi是否为null
    Display.getInstance().getResourceAsStream(getClass(), "/players.db")如果找不到指定资源会返回null。检查你的players.db是否放在正确的资源目录下,路径是否正确(比如大小写、开头的斜杠是否多余/缺失),打包时是否将该文件正确纳入构建产物。

  • 确认输出流po是否为null
    FileSystemStorage.getInstance().openOutputStream(pathp)可能因路径权限不足、路径无法创建(比如父目录不存在且系统不自动创建)等问题导致返回null或抛出异常。可以打印pathp的值,验证路径合法性,同时检查应用是否有文件写入权限。

  • 在调用Util.copy前增加非空校验
    临时在Util.copy前添加日志或打印语句,输出pi和po的对象状态,明确是哪个流为null导致的NPE,比如:

    if(pi == null) Log.e("Input stream is null");
    if(po == null) Log.e("Output stream is null");
    
  • 验证FileSystemStorage单例是否正常初始化
    虽然概率较低,但如果FileSystemStorage.getInstance()初始化失败返回null,后续调用exists和openOutputStream都会出问题。可以先获取单例并校验:

    FileSystemStorage fs = FileSystemStorage.getInstance();
    if(fs == null) {
        Log.e("FileSystemStorage instance is null");
        return;
    }
    

    再用fs替代原代码中的FileSystemStorage.getInstance()调用。

  • 检查Util.copy方法的内部实现
    确认该方法是否未对null流做防护处理,比如直接调用流的方法导致NPE。如果是自定义的Util类,检查copy方法的代码;如果是框架提供的方法,查阅文档确认参数是否允许null。

你的代码片段:

String pathp = Display.getInstance().getDatabasePath("players.db").toString();
if(pathp != null && !FileSystemStorage.getInstance().exists(pathp)) {
    try(InputStream pi = Display.getInstance().getResourceAsStream(getClass(), "/players.db");
        OutputStream po = FileSystemStorage.getInstance().openOutputStream(pathp)) {
        Util.copy(pi, po);
        Util.cleanup(po);
        Util.cleanup(pi);
    } catch(IOException err) {
        Log.e(err);
    }
}

内容的提问来源于stack exchange,提问作者curtjacobs1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:11:05