0

我对以下代码有疑问:

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();

        }
    });
}
}

它说我nullPointerExceptionGraphics 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)

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

4

2 回答 2

4

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

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

我假设您尝试像这样初始化它:

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

    ...
}

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

于 2013-02-26T12:57:47.717 回答
2

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

于 2013-02-26T12:57:55.703 回答