2017-04-17 40 views
0

當我運行我的代碼,我得到java.lang.StackOverflowError的java.lang.StackOverflowError的用遞歸性

我會比感激更多,如果有人能告訴我什麼是錯的。

這是我的代碼:

int cantPuntos; 
static int HEIGHT = 625; 
static int WIDTH = 1000; 
Point[] puntos; 
static BufferedImage buff; 

public static void main(String[] args) { 

     JFrame frame = new JFrame(); 
     frame.getContentPane().add(new Main()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(WIDTH, HEIGHT); 
     frame.setVisible(true); 

} 
public void paint(Graphics g){ 
    buff = salPimienta(); 
    Image img = buff; 
    g.drawImage(img, 0,0,this); 
} 


//Cantidad de pixeles dependiendo porcentaje 
public int cantPixelSP(int porcentaje){ 
    cantPuntos = ((HEIGHT*WIDTH)*porcentaje)/100; 
    puntos = new Point[cantPuntos]; 
    System.out.println("Cont: "+cantPuntos); 
    return (int) (cantPuntos); 
} 

public int generarRandomW(){ 
    return (int) (Math.random()*(WIDTH+1)); 
} 

public int generarRandomH(){ 
    return (int) (Math.random()*(HEIGHT+1)); 
} 

//Genera puntos y los guarda en un arreglo de tipo Point 
public void generarPuntos(int cont){ 
    if(cont<cantPuntos){ 
     puntos[cont]=new Point(generarRandomW(),generarRandomH()); 
     cont++; 
     generarPuntos(cont); 
    } 

} 

//Pinta los puntos de blanco o negro 
public Graphics pintar(Graphics g, int cont){ 
    if(cont<puntos.length){ 
     if(cont<= (int) Math.floor(puntos.length/2)) g.setColor(Color.black); 
     else g.setColor(Color.WHITE); 
     g.drawRect((int) puntos[cont].getX(), (int) puntos[cont].getY(), 1, 1); 
     pintar(g,cont+1); 
    } 
    return g; 
} 

//Crea sal y pimienta 
public BufferedImage salPimienta(){ 
    cantPixelSP(1); 
    System.out.println("Cant: "+cantPuntos+" vector: "+puntos.length); 
    generarPuntos(0); 
    BufferedImage bufferedImage = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB); 
    try { 
     System.out.println(getClass().getResource("/Paris.jpg")); 
     bufferedImage = ImageIO.read(getClass().getResource("/Paris.jpg")); 
    } catch (IOException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    Graphics g = bufferedImage.getGraphics(); 
    g = pintar(g, 0); 
    return bufferedImage; 
} 

我需要噪聲添加到圖像。 StackOverFlowError發生在此函數中:

public void generarPuntos(int cont){ 
    if(cont<cantPuntos){ 
     puntos[cont]=new Point(generarRandomW(),generarRandomH()); 
     cont++; 
     generarPuntos(cont); 
    } 

} 

我會感謝您的幫助。

+4

看着你的代碼,你嘗試減少6,250次。你可以[增加堆棧大小](http://stackoverflow.com/q/3700459/1270789),但我認爲只要將代碼重寫爲for(int cont = 0; cont

+0

如果堆棧上的東西總數超過了這個值,你會得到這個錯誤,你可以通過-Xss選項來增加大小 但是我建議重寫你的代碼 –

+0

我不喜歡遞歸for generarPuntos方法,因爲@ Ken YN說。 – AngelThread

回答

0

使用這個代替

//屬puntos和Los瓜恩未arreglo德TIPO點

公共無效generarPuntos(INT續){

while(cont<cantPuntos){ 

    puntos[cont]=new Point(generarRandomW(),generarRandomH()); 

    cont++; 
}} 

,因爲每個函數調用,它的參數保存在堆棧內存中