任何人都可以对解决以下问题的最佳方法发表自己的看法吗?我已经尝试了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()来溜冰。

07-24 18:30