【问题标题】:NullPointerException from PrintWriter class and File creation来自 PrintWriter 类和文件创建的 NullPointerException
【发布时间】:2015-11-15 14:38:57
【问题描述】:

我一直在编写一小段代码,尽管其余代码都可以运行,但我编写的日志记录系统存在错误。

当调用方法 log(String) 时,它会抛出 NullPointerException。 我认为这可能是因为可能没有创建文件,但我不确定我做错了什么,据我所知应该创建文件(不是),即使我创建了文件放到正确的位置,还是会抛出异常。

我一直在修改它,所以其中一些没有意义,可能是因为它是在我调试的时候。

代码如下:

package UI;

import java.io.File;
import java.io.PrintWriter;



public class InputLogger {

//Necessary for interceptor pattern

private static PrintWriter output;

//For testing remove later
private static File logFile;

public InputLogger() {
    initiate("log.txt");
}
public InputLogger(String anotherFile) {
    initiate(anotherFile);
}

public void initiate(String filename) {
    try {
        /*File */logFile = new File(filename);
        if(!logFile.exists()) {
            if(!logFile.createNewFile())
                System.err.println("Error creating log file. Please verify that files can be created.");
        }
        output = new PrintWriter(logFile);
    } catch (Exception e) {
        System.err.println("Error accessing log file. Please verify that files can be created.");
    }
}

public static void log(String action) {

    try {
        output.println(action);
    } catch (Exception e) {
        e.printStackTrace(System.out);
        System.err.println("Error printing to log file. Please verify that file exists or can be created.");
    }
}

public void close() {
    output.close();
}
}

我认为这可能与我将其称为静态方法这一事实有关,但我一直在环顾四周,似乎无法在其他地方找到解释。

编辑:
我忘了实际创建一个 InputLogger 对象。谢谢大家。

【问题讨论】:

  • 您是如何创建 Logger 和通话记录的?

标签: java exception file-io


【解决方案1】:

您很可能忘记创建 InputLogger 对象。这样做:

InputLogger logger = new InputLogger();
InputLogger.log( "hoooey" );
logger.close();

不调用 close 可能会丢失一两行。

将静态与构造函数和适当的方法混合是危险的,也是一种反模式。您可能会保留静态,使用延迟初始化,让您的程序有机会设置文件名。或者,更好的是,避免静态并以适当的方法做所有事情。

【讨论】:

  • 这似乎奏效了。我已经对其进行了初始化,但出于某种我不记得的原因将其删除。谢谢。我现在正在尝试静态,因为它被许多 ActionListeners 调用,我认为这比将 InputLogger 放入每个侦听器更容易。我一开始就尝试过,但它导致了很多循环依赖和过度复杂,所以我尝试使用静态,它主要工作。再次感谢。在如此有限的(对我而言)信息的情况下,人们能以多快的速度回复我的确切答案,这让我一直感到惊讶。
【解决方案2】:

initiate 方法中初始化output,但在静态方法log 中,不能保证在调用之前已经初始化。

为了安全起见,您应该始终在静态方法中或作为字段声明初始化所需的静态变量。

在这种情况下,在您的 initiate 中,可以在 output = new PrintWriter(logFile) 行之前抛出异常,这意味着 output 为空

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多