2013-02-26 15 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