2017-04-17 7 views
0

Wenn ich betreiben meinen Code erhalte ich java.lang.StackOverflowErrorjava.lang.StackOverflowError mit Rekursivität

wäre ich mehr als dankbar, wenn mir jemand sagen kann, was falsch ist.

Dies ist mein Code:

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; 
} 

ich Lärm auf ein Bild hinzufügen müssen. Der StackOverFlowError tritt in dieser Funktion auf:

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

} 

Ich werde Ihre Hilfe zu schätzen wissen.

+4

Mit Blick auf Ihren Code, versuchen Sie, 6.250 mal zu rekrutieren. Sie können [die Stack-Größe erhöhen] (http://stackoverflow.com/q/3700459/1270789), aber ich denke, dass es viel besser wäre, den Code einfach umzuschreiben als 'for (int cont = 0; cont

+0

Wenn die Gesamtmenge von Zeug auf dem Stapel diesen Wert übersteigt, erhalten Sie diesen Fehler, Sie können die Größe erhöhen, indem Option -Xss Aber ich empfehle, Ihren Code neu zu schreiben –

+0

Ich würde nicht Rekursion für generarPuntos Methode als @ Ken YN bevorzugen sagt. – AngelThread

Antwort

0

Verwendung dieses anstelle

// Genera puntos y los guarda en un arreglo de tipo Punkt

public void generarPuntos (int cont) {

while(cont<cantPuntos){ 

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

    cont++; 
}} 

da jedem Funktionsaufruf und seine Parameter werden im Stapelspeicher gespeichert

Verwandte Themen