类包添加方法在包声明上抛出StackOverflowError

时间:2014-04-05 00:03:26

标签: java stack-overflow

我正在制作供个人使用的图书馆;在这个特定的类中,扩展JPanel,我的代码仍然是出于某些随机原因,产生StackOverflowError任何提示?

public class XJPanel extends JPanel
{
    static boolean isManaged = false;

    public XJPanel() {

    }

    public XJPanel(LayoutManager arg0) {
        super(arg0);
        isManaged = true;
    }

    public XJPanel(boolean arg0) {
        super(arg0);
        // TODO Auto-generated constructor stub
    }

    public XJPanel(LayoutManager arg0, boolean arg1) {
        super(arg0, arg1);
        isManaged = true;
    }
    public GridBagConstraints getConstraints()
    {
        if(isManaged = true)
        {
            return new GridBagConstraints();
        }
        throw new NullPointerException("No Layout Manager Found");
    }


    /*
    public XJPanel add(Component arg0)
    {
        JPanel p = getRoot();
        p.add(arg0);
        return null;
    }

    private JPanel getRoot() {
        return this;
    }*/

它读取的错误完全如下。我想我明白StackOverflowError是什么,但我想知道为什么错误信息包含包声明 - 它不包含代码,所以......为什么?

Exception in thread "main" java.lang.StackOverflowError
at javar.swing.XJPanel.getRoot(XJPanel.java:61)
at javar.swing.XJPanel.add(XJPanel.java:55)
at javar.swing.XJPanel.add(XJPanel.java:1)
...
at javar.swing.XJPanel.add(XJPanel.java:56)
at javar.swing.XJPanel.add(XJPanel.java:1)
at javar.swing.XJPanel.add(XJPanel.java:56)

javar.swing.XJPanel.add(XJPanel.java:1)是我的包裹声明。

注意:

我很抱歉成为这样一个混蛋,@ SimonC我想我有一个grumps的案例,我现在已经很好地休息并准备好了。

3 个答案:

答案 0 :(得分:2)

你有:

public XJPanel add(Component arg0)
{
    JPanel p = getRoot();
    p.add(arg0);
    return null;
}

private JPanel getRoot() {
    return this;
}

当然,这是无限递归的(因为你的堆栈跟踪清楚地表明了,并且快速浏览一下代码显示 - 尝试在头脑中运行它。)

另请参阅StackOverflowError的文档,其中说明:

  

当由于应用程序过于冗长而发生堆栈溢出时抛出。

答案 1 :(得分:2)

你已经实现了递归的add方法。

public XJPanel add(Component arg0) {
    JPanel p = getRoot();
    p.add(arg0);
    return null;
}

private JPanel getRoot() {
    return this;
}

基本上等同于

public XJPanel add(Component arg0)
{
    this.add(arg0);
    return null;
}

哪个是无限的无限递归,显然会出现stack overflow错误。


编辑以回复评论:

当堆栈溢出时,进一步执行是不可能的,所以堆栈上的最后一个方法 为了调试而打印。这将打印方法的完整名称,包括包名,类名和方法名(可在此处看到)。

答案 2 :(得分:1)

其他问题回答了为什么抛出StackOverflowError(当然不是随机的),而是回答你为什么你的包名包含在堆栈跟踪中的具体问题:因为那是最后一个的包名在堆栈溢出之前调用的方法。