java.lang.StackOverflowError 在主线程中
java.lang.StackOverflowError in Thread main
我正在尝试在 Canvas 中绘制字符串。当我实例化扩展 Canvas
的 class 时发生错误,为什么我得到它?
错误堆栈
at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222)
at java.awt.Window.init(Window.java:505)
at java.awt.Window.<init>(Window.java:537)
at java.awt.Frame.<init>(Frame.java:420)
at javax.swing.JFrame.<init>(JFrame.java:233)
at canvas.Canvas.<init>(Canvas.java:20)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas.<init>(Canvas.java:17)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas.<init>(Canvas.java:17)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas.<init>(Canvas.java:17)`
这是我的代码:
public class Canvas extends JFrame{
DrawCanvas cc = new DrawCanvas();
public Canvas(){
super("Canvas");
setVisible(true);
setSize(100, 100);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(cc);
}
public static void main(String[] args) {
Canvas c = new Canvas();
}
private class DrawCanvas extends Canvas{
@Override
public void paint(Graphics g){
g.drawString("String", 10, 10);
}
}
}
这就是你做错的地方:Canvas
构造函数创建了一个新的 DrawCanvas
,但是 DrawCanvas
扩展了 Canvas
,因为你没有指定一个不同的构造函数,它采用其超类 (Canvas
) 的构造函数,因此也会生成一个新的 DrawCanvas
,这会生成另一个 DrawCanvas
... 无限循环。因此你的代码:
new DrawCanvas()
导致无限递归。
您是要延长 java.awt.Canvas
吗?
此外,您可能希望避免使用与 Java API、 尤其是 中的名称相似的名称,如果您我正在使用名称相似的 类.
我正在尝试在 Canvas 中绘制字符串。当我实例化扩展 Canvas
的 class 时发生错误,为什么我得到它?
错误堆栈
at sun.awt.Win32GraphicsConfig.getBounds(Native Method)
at sun.awt.Win32GraphicsConfig.getBounds(Win32GraphicsConfig.java:222)
at java.awt.Window.init(Window.java:505)
at java.awt.Window.<init>(Window.java:537)
at java.awt.Frame.<init>(Frame.java:420)
at javax.swing.JFrame.<init>(JFrame.java:233)
at canvas.Canvas.<init>(Canvas.java:20)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas.<init>(Canvas.java:17)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas.<init>(Canvas.java:17)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas$DrawCanvas.<init>(Canvas.java:35)
at canvas.Canvas.<init>(Canvas.java:17)`
这是我的代码:
public class Canvas extends JFrame{
DrawCanvas cc = new DrawCanvas();
public Canvas(){
super("Canvas");
setVisible(true);
setSize(100, 100);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(cc);
}
public static void main(String[] args) {
Canvas c = new Canvas();
}
private class DrawCanvas extends Canvas{
@Override
public void paint(Graphics g){
g.drawString("String", 10, 10);
}
}
}
这就是你做错的地方:Canvas
构造函数创建了一个新的 DrawCanvas
,但是 DrawCanvas
扩展了 Canvas
,因为你没有指定一个不同的构造函数,它采用其超类 (Canvas
) 的构造函数,因此也会生成一个新的 DrawCanvas
,这会生成另一个 DrawCanvas
... 无限循环。因此你的代码:
new DrawCanvas()
导致无限递归。
您是要延长 java.awt.Canvas
吗?
此外,您可能希望避免使用与 Java API、 尤其是 中的名称相似的名称,如果您我正在使用名称相似的 类.