Java抽象类“实例变量”

时间:2012-06-22 10:14:24

标签: java abstract-class

我不知道我的思想是否只是欺骗了我,或者这真的不起作用。

我需要不同类型的Logging类,所以我创建了一个抽象类,所有类都具有相同的唯一定义是writeToLog的处理方式:

public abstract class LoggerTemplate {

    protected String filename ="log/";
    protected File logfile;

    protected FileWriter fw;

    public void writeToLog(String message) {
        if(fw != null) {
            try {
                message = new SimpleDateFormat("dd-MM-hh:mm").format(new Date()) + " " + message;
                fw.write(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

具体的子类将在其构造函数中实现其余的逻辑,即其中一个:

public class JitterBufferLogger extends LoggerTemplate {

    public JitterBufferLogger() {
        super();
        filename += new SimpleDateFormat("yyyyddMMhhmm'.log'").format(new Date());

        if(!new File("log/").exists())
            new File("log").mkdir();


        logfile = new File(filename);
        try {
            logfile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            fw = new FileWriter(logfile);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

但是当我调试时,我可以看到在为特定记录器调用writeToLog时,它会跳转到LoggerTemplate方法,因此fw和logfile为null。所以它不起作用。

它不应该起作用,或者我只是把东西弄得一团糟,应该进入周末; - )

2 个答案:

答案 0 :(得分:1)

调试器在进入LoggerTemplate方法后进入writeToLog()类是正常的,这是正常的。奇怪的是,基类中的属性具有null值。

我已使用以下简短测试程序测试了您的代码:

public class Test {
    public static void main(String[] args) {
        LoggerTemplate lt = new JitterBufferLogger();
        lt.writeToLog("Hello");
    }
}

fw.flush()调用之后的LoggerTemplate.writeToLog()方法中添加fw.write()后,它对我有用,日志文件已创建并包含日志消息。

也许new File("log").mkdir()或其他一些调用会抛出一个你看不到的异常,因为 stderr 已被重定向到某个地方。

答案 1 :(得分:1)

那么可能缺少什么? - 文件写作者刷新可能有所帮助。 - 我无法用原始代码重现空值,不知道发生了什么。 - 但是,包括我在内的每个人都说:它应该有效,而且确实如此。

为什么日志文件中没有任何内容? - 也许fw的冲洗失踪了..

无论如何我用Printwriter包装它:

public abstract class LoggerTemplate {

    protected String filename ="log/";
    protected File logfile;

    protected PrintWriter pw;

    public void writeToLog(String message) {
            try {
                pw = new PrintWriter(new FileWriter(logfile,true));
                message = new SimpleDateFormat("dd-MM-hh:mm").format(new Date()) + " " + message + "\n";
                pw.write(message);
                pw.flush();
                pw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}

现在它的工作方式应该是预期的。 请注意,不再需要具体子类中的fw实例化。