Java:子类中父类的变量未初始化并保留 null
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);
How can i create frm
instance,with not-null fileName
,例如已经在父级中初始化了吗?
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;
}
}
...
Child class:
...
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) {
...
}
}
The problem is that fileName
is passed as null to frm
in this line:
private FileResourceManager frm = new FileResourceManager(fileName, tempDir, false, loggerFacade);
How can i create frm
instance,with not-null fileName
,e.g. already initialized in parent?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(5)
浅笑轻吟梦一曲2024-10-19 22:17:19
setFile
是您从父类构造函数调用的重写吗?在这种情况下:父类构造函数在子构造函数的有用部分之前运行。因此,从父类构造函数中调用 setFile ,然后将控制权返回到已将该变量清空的子类构造函数。
实例字段初始化程序和实例初始化程序实际上是构造函数的一部分,在可能隐式调用 super 之后(但如果它们调用 this()
则不是)。我相信 C Sharp 在调用 super 之前插入实例初始化程序(但它们不能引用 this
)。
该怎么做:避免继承总是好的。特别是避免受保护的变量和从构造函数调用可重写的方法。保持构造函数简单。并且不要将 = null
添加到实例字段。
花开浅夏2024-10-19 22:17:19
使用以下代码解决:
private static FileResourceManager frm;
public void writeOut(E event) throws IOException {
...
if (frm == null) {
frm = new FileResourceManager(fileName, tempDir, false, loggerFacade);
}
Object txId = null;
try {
...
}
catch (Exception e) {
...
}
}
fileName
在 writeOut() 方法中初始化(不为空)。
不是很优雅,但在我的情况下看起来是最简单的解决方案。
~没有更多了~
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
如果我正确理解你的问题,你可以执行以下操作之一:
UPDATE
AFAIU,问题出在字段初始化顺序上。将“frm”字段初始化移动到子类构造函数中应该可以解决问题:
If I understand your question correctly, you can do one of the following:
UPDATE
AFAIU, the problem is in fields initialization order. The moving "frm" field initialization into child class constructor should solve the problem: