【问题标题】:Exception in Anonymous Inner class example匿名内部类示例中的异常
【发布时间】:2014-07-14 08:31:43
【问题描述】:
public class outer {
    void meth(){
        System.out.println("outer");
    }

    outer y = new outer(){
        void meth(){
            System.out.println("anonymous");
        }
    };

    public static void main(String[] args) {
        outer a = new outer();
        a.meth();
    }
}

运行上面的代码时,我得到:

线程“主”java.lang.StackOverflowError 中的异常

我正在尝试在单个类中执行匿名内部类;那可能吗? 这个异常的原因是什么?

【问题讨论】:

  • @hexafraction 异常在线程“main”java.lang.StackOverflowError

标签: java stack-overflow inner-classes anonymous-class


【解决方案1】:

当构造一个新的outer 时,必须初始化字段y,但这包括创建另一个 outer(或者,更确切地说,outer 的匿名子类) .这会无限期地继续并导致堆栈溢出。

请注意,错误发生在main 的第一行; a.meth() 甚至从未被联系到。


您可以通过不让Outer 在创建时尝试实例化自己来修复代码(例如,您可以使y static):

public class Outer {
    void meth(){
        System.out.println("outer");
    }

    static Outer y = new Outer(){
        void meth(){
            System.out.println("anonymous");
        }
    };

    public static void main(String[] args) {
        Outer a = new Outer();
        a.meth();
        y.meth();
    }
}
外 匿名的

请注意,我假设了一个更传统的命名方案(即 Outer 而不是 outer)。

【讨论】:

  • 所以不可能在单个类文件中写相同的
  • @saurabhkumar 可以(尽管从逻辑上讲,您可能应该将main 分开)。重要的是使y 静态化。我又编辑了。
  • 静态使外部只创建一次对象?这就是stackoverflow异常消失的原因,对吗?
  • 对不起,在 Outer y = new Outer() 前面的 static 表示,我们可以在不创建对象的情况下调用它。我现在吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多