【问题标题】:java.lang.StackOverflowError in Thread main线程主中的 java.lang.StackOverflowError
【发布时间】:2017-05-18 15:37:37
【问题描述】:

我正在尝试在 Canvas 中绘制字符串。当我实例化扩展Canvas 的类时发生错误,为什么会得到它?

错误堆栈

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.Canvas$DrawCanvas.(Canvas.java:35) 处的 canvas.Canvas$DrawCanvas.(Canvas.java:35) 处继续重复。 Canvas.(Canvas.java:17)`

标签: java canvas netbeans graphics awt


【解决方案1】:

这就是你做错的地方:Canvas 构造函数创建了一个新的DrawCanvas,但DrawCanvas 扩展了Canvas,并且由于你没有指定不同的构造函数,它采用其超类的构造函数(Canvas),因此也产生了一个新的DrawCanvas,这又产生了另一个DrawCanvas...无限。因此你的代码:

new DrawCanvas()

导致无限递归。

您的意思是扩展java.awt.Canvas 吗?

此外,您可能希望避免为您的类赋予与 Java API 中相似的名称,尤其是,如果您使用的是那些名称相似的类。

【讨论】:

  • 谢谢,我要改变什么来执行paint方法?
  • @Filippo 好吧,我会先更改您的班级名称。你想扩展Java Canvas 不是吗?您可以写extends java.awt.Canvas 或将JFrame 重命名为MyWIndow 之类的其他名称。因为我认为您不打算让Canvas 扩展您的JFrame
  • 现在可以了,我正在扩展我项目的 Canvas 类而不是 java.awt.Canvas,谢谢
猜你喜欢
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多