2013-02-26 58 views
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(); 

     } 
    }); 
} 
} 

它说我在Graphics grafika; 得到了nullPointerException当我做:

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) 

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

+0

如果这是一个applet,它不应该使用main()方法运行。 – gd1 2013-02-26 12:55:53

+0

Fraktalz构造函数在哪里?既然你没有初始化Grafika它将是空的。 – Infested 2013-02-26 12:58:26

回答

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 ...导致无限厕所页。

2

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

+2

良好的捕获,但'StackOverflow'异常堆栈跟踪不显示'smoke()'方法,而是它显示'Fraktalz'默认构造函数只有 – 2013-02-26 13:03:13

+0

嗯,是的,你是对的! – Sebastian 2013-02-26 13:06:18