ArrayIndexOutOfBounds

Oder benutze eine CSV Lib z.B. opencsv

Mal ne frage zum der Lib.

Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space
Exception occurred during event dispatching:
java.lang.OutOfMemoryError: Java heap space

diese Fehlermeldung bekomme ich wenn ich versuch meine eigenen seperatoren zu setzen.... kannst du mir sagen woran es liegt?

Code:
CSVReader Datei = new CSVReader(new FileReader("C:\\Documents and Settings\\Paul\\Desktop\\Script\\test.csv"), ';');
 
java.lang.OutOfMemoryError: Java heap space

Dein java Heap Speicher geht dir aus...dieser ist standardmässig maximal 64MiByte, den kannst du mittels eines Java VM Parameters leicht erhöhen: -Xmx128
 
java.lang.OutOfMemoryError: Java heap space

Dein java Heap Speicher geht dir aus...dieser ist standardmässig maximal 64MiByte, den kannst du mittels eines Java VM Parameters leicht erhöhen: -Xmx128

ok ... ist das normal ^^? ich mein das programm ist relativ klein, ebenso die csv die hat gerade mal 5 einträge mit 6 spalten .... die richtige csv wird nachher über 2k einträge haben O.o
 
Also das mit dem Speicher erhöhen sollte meiner Meinung nach der letzte Ausweg sein, da man es auch immer explizit angeben muss.
Normal ist es nicht wenn dein Programm nicht sehr groß ist. Ich würde sagen, dass du irgendwo viele Objecte erzeugst die den Speicher zum Überlaufen bringen.
Vielleicht solltest du mal den Code posten, wenn es möglich ist.

MFG

zEriX
 
Naja normal ist das glaub ich nicht...die Frage ist auch machst du vorher irgendetwas was nicht aufgeräumt werden kann?

Ansonsten würde ich mal die JConsole im jdk bin Verzeichnis zur Rate ziehen wie es mit der Speicherentwicklung aussieht.
 
Das wäre der Code, das Speicherproblem tritt aber nur auf wenn ich versuche den CSVReader mit meinen eigenen seperatoren zu füttern.

Code:
import java.io.*;
import java.sql.*;
import au.com.bytecode.opencsv.*;

Boolean ok = false;
String zeile;
String separator;
int count = 0;
	try 
	{
	    BufferedReader CSVFile = new BufferedReader(new FileReader("C:\\Documents and Settings\\Paul\\Desktop\\Script\\test.csv"));
            zeile = CSVFile.readLine();

	    if(zeile != null)
	    {
		System.out.println("......... Loading file ok!");
		if(zeile.contains(";"))
		{
			System.out.println("......... CSV-File seperated by using \";\"");
			ok = true;
			separator = ";";
		}
		else if(zeile.contains(","))
		{
			System.out.println("......... CSV-File seperated by using \",\"");
			ok = true;
			separator = ",";
		}
		else
		{
			System.out.println("......... Can't find separate entry, maybe this is no CSV-File or wrong CSV-File-Format!");
		}
	    }

	    if(ok == true)
	    {
		    CSVReader Datei = new CSVReader(new FileReader("C:\\Documents and Settings\\Paul\\Desktop\\Script\\test.csv"));
		    String [] daten;

		    while ((daten = Datei.readNext()) != null)
		    {
			count++;
			//SHOWS THE CSV CONTENT
			System.out.println(
						daten[0] + "\t" + 
						daten[1] + "\t" + 
						daten[2] + "\t" +
						daten[3] + "\t" +
						daten[4] + "\t" +
						daten[5] + "\t"
					   );
			//SHOWS THE CSV CONTENT

			//SQL CONNECTION
			Connection conn = null;
			String treiber = "com.mysql.jdbc.Driver"; 
			String url = "jdbc:mysql://localhost:3306/csv_test"; 
			String userName = "root";
			String password = "root";
			//SQL CONNECTION

			//SQL STATEMENTS
			String SqlUpdate = "Update `stundenplan` SET Stunde = '"+daten[0]+"', Montag = '"+daten[1]+"', Dienstag = '"+daten[2]+"', Mittwoch = '"+daten[3]+"', Donnerstag = '"+daten[4]+"', Freitag = '"+daten[5]+"' WHERE Stunde = '"+daten[0]+"' ";
			String SqlSelect = "SELECT Stunde FROM `stundenplan` WHERE Stunde = '"+daten[0]+"' ";
			String SqlInsert = "INSERT INTO `stundenplan` (Stunde, Montag, Dienstag, Mittwoch, Donnerstag, Freitag) VALUES ('"+daten[0]+"', '"+daten[1]+"', '"+daten[2]+"', '"+daten[3]+"', '"+daten[4]+"', '"+daten[5]+"') ";
			//SQL STATEMENTS

			try 
			{ 
				Class.forName ( treiber ).newInstance (); 
				conn = DriverManager.getConnection (url, userName, password);
			}
			catch (Exception e) 
			{ 
				System.err.println ("Error connecting to server! "+e); 
			}
			
			try 
			{
				java.sql.Statement s = conn.createStatement();
				ResultSet result = s.executeQuery (SqlSelect);

				if(result.next())
				{
					if(result.getString("Stunde") == daten[0])
					{
						java.sql.Statement u = conn.createStatement();
						int r = u.executeUpdate (SqlUpdate);
					}	
				}
				else
				{
					i = conn.createStatement();
					int r2 = i.executeUpdate (SqlInsert);
				}
				s.close();
			}
			catch (Exception e) 
			{
				return ("Error writing to Database! "+e);
			}
			conn.close();
			//SQL CONNECTION
		    }
		    System.out.println("......... " + count + " entries proceded!");
		    return (SqlUpdate);
		    return (SqlInsert);
		    CSVFile.close();
		    Datei.close();
	    }
        }
        catch (IOException e) 
	{
           System.out.println("Error reading from file! \n" +
			      "Please check the filename (test.csv) and the path.");
	   //System.out.println(e.toString());
        }
 
Das wird zwar wahrscheinlich nicht das Problem sein, aber ein möglicher Memory Leak hab ich schon gefunden.
Das Schliesen der Verbindung und des Statements sollte in einen finally Block nach dem try catch, ansonsten kann es sein dass es nicht geschlossen wird und ich glaube je nachdem brauchst du in dem finally nochmals ein try catch.

Dann solle man Strings mit .equals oder equalsIgnoreCase vergleichen, bei == vergleicht man die Speicheradresse aber nicht den Inhalt.
 
Nach einem neustart kommt dieser fehler nicht mehr, scheint nur zu kommen, wenn man das programm öfters compiliert und ausführt.

Jetzt kann ich auch sagen welche Fehlermeldung exakt ich bekomme, beim einstellen der seperatoren.

Could not find matching constructor for au.com.bytecode.opencsv.CSVReader(java.io.FileReader, java.lang.String)

Was damit jemand was anzufangen bzw. eine möglichkeit dies zu beheben?
 

Neue Beiträge

Zurück