elvishew/xLog

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;
}

Track in #70