我不知道我的思想是否只是欺骗了我,或者这真的不起作用。
我需要不同类型的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。所以它不起作用。
它不应该起作用,或者我只是把东西弄得一团糟,应该进入周末; - )
答案 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实例化。