Warum StackOverFlowError?

Status
Nicht offen für weitere Antworten.

Fridolin

Bekanntes Mitglied
Edit von L-ectron-X: Thema geteilt da neuer Topic


weißt du vielleicht warum ich bei der umgeschriebenen application vom applet einen stackoverflowerror bekomme?
Es soll einfach nur in einer Textdatei, in welcher hintereinander(ohne Leerzeichen) 18 Zeilen mit je 42 zeichen
in der art nwn mit einem streamtokenizer nachgeschaut werden ob der nächste token ein oder kein n ist wenn ja dann
soll an dieser position im frame ein blaues rechteck gezeichnet werden ansonsten ein schwarzes ich hab
eine bestimmte blockgröße in x und y richtung die ich nach jedem switch case zur x und y(falls EOL Ende der Zeile)
Ursprung des rechtecks dazuzähle

lg Fridolin
Code:
import java.awt.*;
import java.io.*;
import javax.swing.*;

public class VersuchPacman extends JFrame 
{
	private Graphics dbg;
	StreamTokenizer tokenizer;
	//BufferedReader in;
	FileInputStream is;
	Reader r;
	String board[][] = new String[18][42]; 
	String message = "";
	int boardint[][] = new int[18][42]; 
	int count1 = 0;
	int count2 = 0;
	int boardx = 0;
	int boardy = 0;
	int blocksizex = 7; 
	int blocksizey = 16; 
	int token;
	
public void VersuchPacman()
{
	

	try
		{
  			
  			//in = new BufferedReader(
			//new FileReader("Kopie von Mappe.txt")); 
			//tokenizer = new StreamTokenizer(in); 
			is = new FileInputStream("Kopie von Mappe.txt"); 
			r = new BufferedReader(
				new InputStreamReader(is)); 
			tokenizer = new StreamTokenizer(r); 
			tokenizer.parseNumbers();
			tokenizer.wordChars('c', 'c');
			tokenizer.wordChars('w', 'w');
			tokenizer.wordChars('n', 'n');
			tokenizer.wordChars('s', 's');
			tokenizer.wordChars('e', 'e');
			//tokenizer.wordChars('0', ' ');
			tokenizer.ordinaryChars(0, ' ');
			tokenizer.whitespaceChars(' ',' ');
        	tokenizer.eolIsSignificant(true);
        	tokenizer.slashStarComments(true);
        	tokenizer.slashSlashComments(true);
        	
		while ((token = tokenizer.nextToken()) != StreamTokenizer.TT_EOF)
		{
  		switch (token)
  			{
    	case StreamTokenizer.TT_WORD:
      		message = "Word: " + tokenizer.sval;
      		board[count1][count2] = tokenizer.sval;
            count2++;
      		break;
      	case StreamTokenizer.TT_EOL:
      		count1++;
            break;
        case StreamTokenizer.TT_EOF:
        	count1 = 0;
        	count2 = 0;
            break;
        //default:
            //char ch = (char)tokenizer.ttype;
            //break;
  			}
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
			for(count2 = 0; count2 <= 40; count2++)
			{
			boardint[count1][count2] = Integer.parseInt(board[count1][count2]);
			}	
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
                           		if(count1 != 0)
                                {
                                boardy+=blocksizey;
                                boardx = 0;
                                }
			for(count2 = 0; count2 <= 40; count2++)
			{
			switch (boardint[count1][count2])
				{
  			case 'n': 
  				if(dbg == null)
  				{
  				dbg = getGraphics();
  				}
  				dbg.setColor(Color.blue);
    			break;
  			default: 
  				if(dbg == null)
  				{
  				dbg = getGraphics();
  				}
  				dbg.setColor(Color.black);
    			break;
				}
				
		dbg.drawRect(boardx,boardy,blocksizex,blocksizey);
		dbg.fillRect(boardx,boardy,blocksizex,blocksizey);
                                boardx+=blocksizex;
                                
			}	
		}
		paint(dbg);		
	} 
catch (final IOException e) { }
}
	
	public void paint(Graphics g)
	{
	paint(g);
	}
	
	public static void main(String args[])
	{
	VersuchPacman neu = new VersuchPacman();
	neu.setSize(294,288);
	neu.setLocation(100,100);
	neu.setVisible(true);
	} 
}
 

L-ectron-X

Gesperrter Benutzer
Ein StackOverflowError wird glaube ich dann geworfen, wenn die maximale Rekursionstiefe überschritten wird. Aber das weiß ich nicht ganz genau. Auf jeden Fall ist Dein Konstruktor verkehrt, er wird niemals aufgerufen.
Code:
public void VersuchPacman()
...ist eine ganz normale (bis auf den ersten großen Buchstaben) Instanzmethode, die im übrigen nie aufgerufen wird, und keine Konstruktormethode.

Dein Konstruktor sollte eigentlich so aussehen:
Code:
public VersuchPacman()
 

Fridolin

Bekanntes Mitglied
War trotzdem nicht der Fehler vielleicht funktioniert das mit dem Applet aber wahrscheinlich kommt
da derselbe fehler
 

L-ectron-X

Gesperrter Benutzer
Ich habe mir mal den Code etwas näher angesehen. Der StackOverFlowError wird geworfen, weil Du in der paint()-Methode die paint()-Methode aufrufst. Das ist quasi eine Endlosschleife.

Code:
catch (final IOException e) { }
das final in der catch-Anweisung muss glaube ich weg.

Danach kannst Du beginnen, die paint()-Methode zu implementieren. Ich bin mir nur nicht sicher, ob hier jetzt nicht die paintComponent()-Methode überschrieben werden muss, da Du nicht mehr ein Applet programmierst, wie in Deiner ersten Version, sondern eine Swing-Applikation...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben