Parent class(*ch.qos.logback.core.FileAppender*):
...
protected String fileName = null;
public FileAppender() {
}
public void setFile(String file) {
if (file == null) {
fileName = file;
} else {
// Trim spaces from both ends. The users probably does not want
// trailing spaces in file names.
String val = file.trim();
fileName = val;
}
}
...
子类:
...
public class FileAppender<E> extends ch.qos.logback.core.FileAppender<E> {
private FileResourceManager frm = new FileResourceManager(fileName, tempDir, false, loggerFacade);
public void writeOut(E event) throws IOException {
Object txId = null;
try {
frm.start();
txId = frm.generatedUniqueTxId();
frm.startTransaction(txId);
outputStream = frm.writeResource(txId, fileName, true);
outputStream.write(event.toString().getBytes());
frm.commitTransaction(txId);
}
catch (Exception e) {
...
}
}
问题是 fileName
在这一行中作为 null 传递给 frm
:
private FileResourceManager frm = new FileResourceManager(fileName, tempDir, false, loggerFacade);
如何创建 frm
实例,fileName
不为空,例如已经在父级中初始化了吗?
最佳答案
如果我正确理解您的问题,您可以执行以下操作之一:
- 在子类的构造函数中调用setFile(file)
- 在子构造函数中实现 setFile() 方法中的逻辑(顺便说一句,这将是代码重复)
- 如果父类提供了接受文件参数的构造函数,则在子类的构造函数中使用 super(file) 调用父类的构造函数
更新
AFAIU,问题出在字段初始化顺序上。将“frm”字段初始化移动到子类构造函数中应该可以解决问题:
public FileAppender(String fileName) {
setFile(fileName);
frm = new FileResourceManager(fileName, tempDir, false, loggerFacade);
...
}
关于Java:子类中父类的变量未初始化并保留 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4734290/