复制数据库到FileSystemStorage时触发NullPointerException的原因排查
针对你遇到的问题,从以下几个方向逐一排查:
确认输入流
pi是否为nullDisplay.getInstance().getResourceAsStream(getClass(), "/players.db")如果找不到指定资源会返回null。检查你的players.db是否放在正确的资源目录下,路径是否正确(比如大小写、开头的斜杠是否多余/缺失),打包时是否将该文件正确纳入构建产物。确认输出流
po是否为nullFileSystemStorage.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

