Attempt to invoke virtual method 'boolean java.io.File.createNewFile()' on a null object reference
Closed this issue · 4 comments
java.lang.NullPointerException
Attempt to invoke virtual method 'boolean java.io.File.createNewFile()' on a null object reference
com.elvishew.xlog.printer.file.FilePrinter$Writer.boolean open(java.lang.String)(FilePrinter.java:432)
现在在线上使用xlog,有几个用户遇到这个崩溃。
可能是什么原因导致的?
@yuqirong Have you modified the xlog library's source code? Seems no way to throw this exception if you just use xlog
java.lang.NullPointerException
Attempt to invoke virtual method 'boolean java.io.File.createNewFile()' on a null object reference
com.elvishew.xlog.printer.file.FilePrinter$Writer.boolean open(java.lang.String)(FilePrinter.java:450)
com.elvishew.xlog.printer.file.FilePrinter.void doPrintln(long,int,java.lang.String,java.lang.String)(FilePrinter.java:136)
com.elvishew.xlog.printer.file.FilePrinter.void access$200(com.elvishew.xlog.printer.file.FilePrinter,long,int,java.lang.String,java.lang.String)(FilePrinter.java:42)
##parent##1##parent##
##child## java.lang.String access$300(com.elvishew.xlog.printer.file.FilePrinter)##child##
com.elvishew.xlog.printer.file.FilePrinter$Worker.void run()(FilePrinter.java:378)
java.lang.Thread.run(Thread.java:764)
是的 我改了一下xlog的源码,但是修改的代码对 logFile 没有影响。
我只是加了一个在新日志文件开头写入用户设备信息的功能
这是 bugly 上面报出来的错,对应的 FilePrinter 第 450 行 是 logFile.createNewFile(); 这句代码。不明白为什么这时候 logFile 是空的,感觉是其他什么地方把 logFile 置空了
boolean open(String newFileName) {
lastFileName = newFileName;
logFile = new File(folderPath, newFileName);
boolean createNewFile = false;
// Create log file if not exists.
if (!logFile.exists()) {
try {
File parent = logFile.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
logFile.createNewFile(); // 这里是 450 行
createNewFile = true;
} catch (Exception e) {
e.printStackTrace();
lastFileName = null;
logFile = null;
return false;
}
}
// Create buffered writer.
try {
bufferedWriter = new BufferedWriter(new FileWriter(logFile, true));
// 添加文件头部信息
if (createNewFile && fileHeaderGenerator != null) {
List<String> headerList = fileHeaderGenerator.printHeader();
if (headerList != null && !headerList.isEmpty()) {
long timeMillis = System.currentTimeMillis();
for (String header : headerList) {
String flattenedLog = flattener.flatten(timeMillis, LogLevel.INFO, "Header", header).toString();
writer.appendLog(flattenedLog);
}
}
}
} catch (Exception e) {
e.printStackTrace();
lastFileName = null;
logFile = null;
return false;
}
return true;
}