该代码有什么问题?

时间:2013-02-26 12:52:01

标签: java

我遇到以下代码的问题:

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;    

public class Fraktalz extends Applet{

private static final long serialVersionUID = 1L;
Graphics grafika;   

public void paint(Graphics g){
    g.setColor(Color.white);
    g.fillRect(0, 0, 640, 480);
    g.setColor(Color.black);
    smok(200,360,500,120,20);


}


public void smok(int x1, int y1, int x2, int y2, int iteracja){
    if (iteracja == 0){
        grafika.drawLine(x1,y1,x2,y2);
    } else{
        int cx = (x1 + x2) / 2;
        int cy = (y1 + y2) / 2;

        int x3 = cx + (y2 - cy);
        int y3 = cy + (x2 - cx);

        smok(x1,y1,y3,y3,iteracja-1);
        smok(x2,y2,x3,y3, iteracja-1);
    }
}   

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            new Fraktalz();

        }
    });
}
}

它说我在nullPointerException获得Graphics grafika; 当我完成时:

Fraktalz fr = new Fraktalz();
Graphics grafika = fr.getGraphics();

我收到了一个错误:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at java.lang.Class.getClassLoader(Unknown Source)
    at java.awt.Component.checkCoalescing(Unknown Source)
    at java.awt.Component.<init>(Unknown Source)
    at java.awt.Container.<init>(Unknown Source)
    at java.awt.Panel.<init>(Unknown Source)
    at java.awt.Panel.<init>(Unknown Source)
    at java.applet.Applet.<init>(Unknown Source)
    at Fraktalz.<init>(Fraktalz.java:6)
    at Fraktalz.<init>(Fraktalz.java:9)
    at Fraktalz.<init>(Fraktalz.java:9)

有人可以帮我解决这个错误吗?

2 个答案:

答案 0 :(得分:4)

创建一个构造函数并在那里初始化grafika:

public class Fraktalz extends Applet{
    public Fraktalz() {
        grafika = getGraphics();
    }
}

我假设你试图像这样初始化它:

public class Fraktalz extends Applet{
    Fraktalz fr = new Fraktalz();
    Graphics grafika = fr.getGraphics();

    ...
}

这导致StackOverflow,因为您正在创建Fraktalz的实例,这导致其fr成员通过创建Fraktalz实例进行初始化,这再次导致其fr {1}}成员......导致无限循环。

答案 1 :(得分:2)

这可能是无限递归。 paint()调用smok()。 smok()调用smok()或drawLine()。 drawLine()再次调用paint()......