Java抽象类“;实例变量";
我不知道是我的头脑愚弄了我还是这真的不起作用 我需要不同类型的日志记录类,因此我创建了一个抽象类,所有类都具有相同的唯一定义是writeToLog的处理方式: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
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的新包装更新我的帖子,现在可以用了。