Java抽象类“;实例变量";

Java抽象类“;实例变量";,java,abstract-class,Java,Abstract Class,我不知道是我的头脑愚弄了我还是这真的不起作用 我需要不同类型的日志记录类,因此我创建了一个抽象类,所有类都具有相同的唯一定义是writeToLog的处理方式: public abstract class LoggerTemplate { protected String filename ="log/"; protected File logfile; protected FileWriter fw; public void writeToLog(Strin

我不知道是我的头脑愚弄了我还是这真的不起作用

我需要不同类型的日志记录类,因此我创建了一个抽象类,所有类都具有相同的唯一定义是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。所以它不起作用了


它不是应该起作用吗?还是我只是把事情搞砸了,应该去度周末;-)

调试器在进入
writeToLog()
方法时进入
LoggerTemplate
类应该可以正常工作。奇怪的是,基类中的属性有
null

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

public class Test {
    public static void main(String[] args) {
        LoggerTemplate lt = new JitterBufferLogger();
        lt.writeToLog("Hello");
    }
}
在调用
fw.write()
之后,将
fw.flush()
添加到
LoggerTemplate.writeToLog()
方法后,它对我有效,日志文件已经创建,并且包含日志消息

可能是新文件(“log”).mkdir()或其他一些调用引发了一个您无法看到的异常,因为stderr已被重定向到某个位置。

那么可能缺少什么呢? -filewriter刷新可能会有所帮助。 -我无法用原始代码复制空值,不知道发生了什么。 -但正如包括我在内的所有人所说:它应该有效,而且确实有效

为什么日志文件里什么都没有? -也许fw的潮水不见了

不管怎样,我用一个打印机包装了它:

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实例化。

这“应该”起作用(关于超类成员变量的赋值)。您是否调试到了
JitterBufferLogger
的构造函数中?可能stdout去了一个意外的地方,你错过了stacktrace。另外,“log/.20122012.log”(斜杠)不是有效的文件名-请参阅logfile.createNewFile(文件名)。打开文件编写器时是否检查堆栈跟踪?在@ @ Maltink的注释中,无效文件名可能是您的问题。考虑在基类中有一个<代码>文件PARDENDR ,并使基类构造函数填充并创建DIR。然后在具体的类中执行
newfile(super.parentDir,fileName)
super.parentDir.createNewFile(fileName)
newerrorlogger().writeToLog(“测试我的derp技能”);但是主要的问题似乎是fw没有正确地写入文件。我用一个printwriter将它封装起来,它按预期工作。我不知道是什么搞砸了我的大脑,但不知怎么的,我的大脑出了问题。是的,LoggerTemplate的步骤一定在那里,否则它应该如何工作。也许刷新失败了,我会用PrintWriter的新包装更新我的帖子,现在可以用了。