任何人都可以对解决以下问题的最佳方法发表自己的看法吗?我已经尝试了init块并在构造函数中初始化该字段,但是在重写的方法尝试清除它之前都没有被调用。
class TestRunner {
public static void main(String[] args) {
ftw ftw = new ftw();
ftw.dontPanic();
}
}
class wtf {
wtf(){
this.dontPanic();
}
void dontPanic() {
System.out.println("super don't panic");
}
}
class ftw extends wtf {
final HashSet variableOfDoom = new HashSet();
ftw(){
super();
}
void dontPanic() {
super.dontPanic();
System.out.println("sub don't panic");
variableOfDoom.clear(); //This line prints a null pointer exception, because the field hasn't been intialized yet.
}
}
最佳答案
这就是为什么他们建议您不要从构造函数内部调用非final
方法的原因。 private
方法也是安全的,因为它们不能被覆盖。
假设由于某些原因您无法遵循合理的建议,以下是一些其他建议可能会有所帮助:
我假设为简化起见,但是对.clear()
的调用在该示例中并没有真正完成任何事情。您也许可以删除它。
很难说没有总的实际程序,但是您可以通过为变量分配新的HashSet
而不是调用.clear()
来溜冰。