我正在制作供个人使用的图书馆;在这个特定的类中,扩展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的案例,我现在已经很好地休息并准备好了。
答案 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
(当然不是随机的),而是回答你为什么你的包名包含在堆栈跟踪中的具体问题:因为那是最后一个的包名在堆栈溢出之前调用的方法。