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、 尤其是 中的名称相似的名称,如果您我正在使用名称相似的 类.