too many window handles? <-- Warum?

Status
Nicht offen für weitere Antworten.

outbreaker

Bekanntes Mitglied
Hi

Ich habe ein Problem ich lasse meine festplatte nach mp3 dateien durchsuchen das klappt auch soweit nur hab ich ein Problem ich bekomme nach einer weile diesen fehler:
Code:
Exception in thread "Thread-10" java.lang.OutOfMemoryError: too many window handles
	at sun.awt.windows.WToolkit.eventLoop(Native Method)
	at sun.awt.windows.WToolkit.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Ich habe eine Methode welche dir mp3 datein in eine DB schreibt wenn es aber ein Ordner ist dann ruft sich die methode selber wieder auf! Das geht auch eine weile aber bei ca 300 datein kommt dann diese Exception.
Wie kann ich das verhinder?

Code:
	  private int addFilesToVector(File[] fileArray, int count){
		    for (int i = 0; i < fileArray.length; i++){
		      try{
		        if (fileArray[i].isDirectory()){
		          count = addFilesToVector(fileArray[i].listFiles(), count );
		          status.setText("Bitte warten! Anzahl: "+a);
		          System.out.println(fileArray[i].getAbsolutePath());
		        }
		        else{
		          if(fileArray[i].getName().endsWith(".mp3")){
		            result.add( fileArray[i] );
		            file=new Stringformater().getFormatStringEinzeln(fileArray[i]);
		            
		            if (option==2 || !lesen.datenSchonVorhanden(file,tabName)){
         	            											schreiben.datenlöschen(file,tabName);
       											                   schreiben.setDatenToTable(file,tabName);
		            											a++;
		            											}
		            else if (option!=3) 
		            	{
		            	option= new Popup().showOptionsÜberschreiben("Soll die Datei \n\""+
		            													file.elementAt(4)+"\"\n"+
		            													"überschrieben werden?");
		            	if (option==2 || option==0) {
		            		schreiben.datenlöschen(file,tabName);
		            		schreiben.setDatenToTable(file,tabName);
		            		a++;
		            	}
		            }
		          }
		        }
		      }
		      catch(Exception e){
		          e.printStackTrace();
		    	  System.out.println("Suchen Ordner: "+e);
		      }
		    }
		    count += fileArray.length;
		    return a;
		  }


Help :oops:
 

thE_29

Top Contributor
Tjo, wahrscheinlich weil er dir 200 Popups anzeigt, mit der Abfrage, ob überschreiben werden soll??
 

outbreaker

Bekanntes Mitglied
nein macht er nicht weil er nicht in den else zweig kommt
weil die db ja leer ist

lesen.datenSchonVorhanden(file,tabName) <-überprüft ob die daten schon drinstehen
kommt da nen false dann macht er das was im if zweig steht
 

Bleiglanz

Gesperrter Benutzer
Mach mal ein System.out.println("option"); nach

else if (option!=3)
{

rein, dann weisst dus, schaut nach "dangling else" aus...
 

outbreaker

Bekanntes Mitglied
Nun bekomme ich diesen fehler und nicht mehr den von oben
aber anfangen kann ich damit nichts

Code:
Exception in thread "Thread-11" java.lang.OutOfMemoryError: Java heap space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
 

thE_29

Top Contributor
Tjo, wahrscheinlich weil du zuviel in deine ArrayList haust..

Irgendwann ist dein Speicher voll...

Müsstest mit größeren Speicher starten...
 

outbreaker

Bekanntes Mitglied
Also ich habe es jetzt soweit abgeändert aber es ändert nichts an dem fehler

Code:
	  private int addFilesToVector(File[] fileArray, int count){
		    for (int i = 0; i < fileArray.length; i++){
		      try{
		        if (fileArray[i].isDirectory()){
		          count = addFilesToVector(fileArray[i].listFiles(), count );
		        }
		        else{
		          if(fileArray[i].getName().endsWith(".mp3")){
		            file=new Stringformater().getFormatStringEinzeln(fileArray[i]);
		            
		            if (option==2 || !lesen.datenSchonVorhanden(file,tabName)){
		            											schreiben.datenlöschen(file,tabName);
                                                                                                           schreiben.setDatenToTable(file,tabName);
		            											}
		            else if (option!=3) 
		            	{
		            	System.out.println("++++++++++++"+option);
		            }
		            	
		            
		          }
		        }
		      }
		      catch(Exception e){
		          e.printStackTrace();
		    	  //System.out.println("Suchen Ordner: "+e);
		      }
		    }
		    count += fileArray.length;
		    return a;
		  }

wie kann ich mit mehr speicher starten??
 

outbreaker

Bekanntes Mitglied
das komisch ist ja das ich an dieser stelle in meinem Programm nichs geändert habe und es hat auch schon einmal funktioniert. Es mehrere Tausend dateien eingelesen ohne eine exception zu bringen! ???

So habe auch mal mit -Xms64m -Xmx400m mehr speicher zugewiesen es stürzt aber immer noch ab und schaft nicht mehr als ca 400 datein
 
G

Gast

Gast
poste/uppe doch man des ganze programm
maybe ist der fehler ja garnicht in dem codestueck..
 

Bleiglanz

Gesperrter Benutzer
du hast einfach den
Code:
                    if (option==2 || option==0) {
                        schreiben.datenlöschen(file,tabName);
                        schreiben.setDatenToTable(file,tabName);
                        a++;
                     }
entfernt, vielleicht hat der "aufgeräumt"?
 

outbreaker

Bekanntes Mitglied
du hast einfach den
Code:
                    if (option==2 || option==0) {
                        schreiben.datenlöschen(file,tabName);
                        schreiben.setDatenToTable(file,tabName);
                        a++;
                     }

entfernt, vielleicht hat der "aufgeräumt"?

was meinst du damit^^??
 

outbreaker

Bekanntes Mitglied
das steht hinter der lesen klasse

Code:
public boolean datenSchonVorhanden(Vector daten,String tabName){
		Statement stmt;
		connectToDB();	//stellt nur die verbindung zur datenbank her
		int anzahl=0;
		try {
			stmt = conn.createStatement();
			ResultSet rs= stmt.executeQuery("SELECT * FROM "+tabName
											+" WHERE LAUFWERK='"+daten.elementAt(0)+
											"' AND PFAD='"+new Stringformater().getCodiertString(daten.elementAt(5).toString())+
											"' AND NAME='"+new Stringformater().getCodiertString(daten.elementAt(3).toString())+"'");
			
			while(rs.next())
			anzahl++;
			
		}
		catch (SQLException e){
			System.out.println(e);
			new Popup().showPopup("Die Tabelle \""+tabName+"\" konnte nicht erreicht werden!","OK");
		}
		catch (Exception e){
			System.out.println(e);
		}
		finally {
			closeDB();//schließt nur die verbindung zur datenbank
			if (anzahl==0)
				return false;
			else return true;
		}
	}

das ist das schreiben Objekt

Code:
	public void datenlöschen(Vector daten,String tabName){
		Statement stmt;
		connectToDB();
		try {
			stmt = conn.createStatement();
			stmt.executeQuery("DELETE FROM "+tabName+" WHERE LAUFWERK='"+daten.elementAt(0)+
							  "' AND PFAD='"+new Stringformater().getCodiertString(daten.elementAt(5).toString())+
							  "' AND NAME='"+new Stringformater().getCodiertString(daten.elementAt(3).toString())+"'");
		}
		catch (Exception e){
			System.out.println(e);
		}
		finally {
			closeDB();
			}
	}


//-----------------------------------------------------------------------------------------

public void setDatenToTable(Vector daten,String tabName){
		Statement stmt;
		MP3File f2;
		Stringformater format = new Stringformater(); //ist dazu da um zeichen dir in sql nicht drin stehen dürfen zu codieren
	try {
		
		connectToDB(); //stellt verbindung zur datenbank her
		stmt = conn.createStatement();
		f2 = new MP3File(daten.elementAt(4).toString()); // an der stelle steht der pfad im vector
		if (f2.hasID3v1()) {
			try {
		stmt.executeQuery("INSERT INTO "+tabName+" VALUES ("+"'"+format.getCodiertString(f2.getID3v1().getArtist())+"'"+","+"'"+format.getCodiertString(f2.getID3v1().getTitle())+"'"+
						","+f2.getID3v1().getYear()+","+"'"+format.getCodiertString(f2.getID3v1().getAlbum())+"'"+","+"'"+format.getCodiertString(f2.getID3v1().getComment())+"'"+","+
						"'"+format.getCodiertString(f2.getID3v1().getGenre())+"'"+","+"'"+daten.elementAt(0)+"'"+","+"'"+
						format.getCodiertString(daten.elementAt(5).toString())+"'"+
						","+"'"+format.getCodiertString(daten.elementAt(3).toString())+"'"+","+"'"+format.getMP3Länge(f2)+"'"+
						","+"'"+format.getFormatDouble(((double)f2.getTheFile().length())/1024/1024)+"'"+")"); 
			}
			catch (Exception e){//hier kommt er rein wenn beim schreiben ein fehler aufgetretten ist und schreibt ihn leer in die db
				 stmt.executeQuery("INSERT INTO "+tabName+" VALUES ("+"'"+""+"'"+","+"'"+""+"'"+
							","+"0"+","+"'"+""+"'"+","+"'"+""+"'"+","+
							"'"+""+"'"+","+"'"+daten.elementAt(0)+"'"+","+"'"+
							format.getCodiertString(daten.elementAt(5).toString())+"'"+
							","+"'"+format.getCodiertString(daten.elementAt(3).toString())+"'"+","+"'"+format.getMP3Länge(f2)+"'"+
							","+"'"+format.getFormatDouble(((double)f2.getTheFile().length())/1024/1024)+"'"+")");
			}
		}
	 else if (f2.hasID3v2()) {

		 try {
			stmt.executeQuery("INSERT INTO "+tabName+" VALUES ("+"'"+format.getCodiertString(f2.getID3v2().getArtist())+"'"+","+"'"+format.getCodiertString(f2.getID3v2().getTitle())+"'"+
					","+f2.getID3v2().getYear()+","+"'"+format.getCodiertString(f2.getID3v2().getAlbum())+"'"+","+"'"+format.getCodiertString(f2.getID3v2().getComment())+"'"+","+
					"'"+format.getCodiertString(f2.getID3v2().getGenre())+"'"+","+"'"+daten.elementAt(0)+"'"+","+"'"+
					format.getCodiertString(daten.elementAt(5).toString())+"'"+
					","+"'"+format.getCodiertString(daten.elementAt(3).toString())+"'"+","+"'"+format.getMP3Länge(f2)+"'"+
					","+"'"+format.getFormatDouble(((double)f2.getTheFile().length())/1024/1024)+"'"+")");
		 }
		 catch (Exception e){
//hier kommt er rein wenn beim schreiben ein fehler aufgetretten ist und schreibt ihn leer in die db
			 stmt.executeQuery("INSERT INTO "+tabName+" VALUES ("+"'"+""+"'"+","+"'"+""+"'"+
						","+"0"+","+"'"+""+"'"+","+"'"+""+"'"+","+
						"'"+""+"'"+","+"'"+daten.elementAt(0)+"'"+","+"'"+
						format.getCodiertString(daten.elementAt(5).toString())+"'"+
						","+"'"+format.getCodiertString(daten.elementAt(3).toString())+"'"+","+"'"+format.getMP3Länge(f2)+"'"+
						","+"'"+format.getFormatDouble(((double)f2.getTheFile().length())/1024/1024)+"'"+")"); 
		 }
 
		
	}
	 else {
//hier kommt er hin wenn es keine id tag gibt
		 stmt.executeQuery("INSERT INTO "+tabName+" VALUES ("+"'"+""+"'"+","+"'"+""+"'"+
					","+"0"+","+"'"+""+"'"+","+"'"+""+"'"+","+
					"'"+""+"'"+","+"'"+daten.elementAt(0)+"'"+","+"'"+
					format.getCodiertString(daten.elementAt(5).toString())+"'"+
					","+"'"+format.getCodiertString(daten.elementAt(3).toString())+"'"+","+"'"+format.getMP3Länge(f2)+"'"+
					","+"'"+format.getFormatDouble(((double)f2.getTheFile().length())/1024/1024)+"'"+")");
		 
	 }
	}
	catch (Exception e) {
		System.out.println(daten.elementAt(3));
		System.out.println("Datenschreiben setDatenToTable Vector: "+e);
	}
	finally {
		closeDB(); //schließt die verbindung zur datenbank
	}
	}

ich hoffe der Code ist verständlich
wenn nicht einfach fragen
 

outbreaker

Bekanntes Mitglied
also ich habe mal alles rausgenommen an abfragen dann geht es
also ich habe nur setDatenToTable drin gelassen dann gehts
nun habe ich datenlöschen reingenommen und der fehler kommt wieder
also muss er in der methode liegen aber wo?
 

outbreaker

Bekanntes Mitglied
also ich habe das gefühl das java nicht damit klar kommt das ich mehrere DB zugriffe habe
sobald ich 2 objekte hab die mit der db arbeiten gibt es einen fehler
also wenn ich lesen.datenSchonVorhanden und schreiben.datenSet.. dann gibs nen heap fehler nehme ich nur eines davon dann gehts

??????????? ???:L ???:L ???:L
 

Mag1c

Top Contributor
Moin,

nach der MP3-Lib fragte ich, weil ich vor kurzem für jemanden hier im Forum herausgefunden habe, daß es ein Bug beim Einlesen von ID3v2-Tags gibt, der zu einer OOM-Exception führt. Das war aber in einer anderen Lib, ist also hier nicht das Problem.

Du solltest mal in deinen DB-Routinen die Statements schließen.

Was genau machen denn connectToDB() und closeDB() ? Ich würde vorschlagen, die Connection zur DB einmal am Anfang aufzubauen und erst am Schluß nach getaner Arbeit wieder zu schließen.

Gruß
Mag1c
 

outbreaker

Bekanntes Mitglied
Hi

also ich habe jetzt erst die connection gemacht dann ein Statment erzeugt und dieses dann bis zum schluß verwendet also nicht immer ein neues erzeugt nun habe ich den fehler nicht mehr bekomme
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A External Sort - too many open files Allgemeine Java-Themen 6
J Too many open files Allgemeine Java-Themen 11
J Too many files open Allgemeine Java-Themen 4
K "Too many open files" bei Property List Allgemeine Java-Themen 5
G To many Code? Was soll der scheiß? Allgemeine Java-Themen 11
M Runtime.exec() => java.io.exception: too many open files Allgemeine Java-Themen 10
N Window Builder Allgemeine Java-Themen 2
Tobero Eclipse Window builder gibt es da sowas wie @ignore? Allgemeine Java-Themen 1
M Eclipse libgcrypt für window in java Projekt einbinden Allgemeine Java-Themen 1
R VM-Error - BadWindow (invalid Window parameter) Allgemeine Java-Themen 4
B Window Closing Event Allgemeine Java-Themen 3
M Wie kann ich alle System.out Strings in ein log window umleiten? Allgemeine Java-Themen 6
S Window Cursor Allgemeine Java-Themen 6
B Window.setAlwaysOnTop(true) - Fokusverlust Allgemeine Java-Themen 4
G System.out im window h.inein bringen? Allgemeine Java-Themen 8
P adding a window to a container Allgemeine Java-Themen 3
vogella Korrektur der Filetypenzuordnung für .jar Files unter Window Allgemeine Java-Themen 2
S Auf vorhandenes Window zeichnen? Allgemeine Java-Themen 2
C JNI, wie bekomme ich das HWND zu einem JWindow oder Window? Allgemeine Java-Themen 3
R Window statt Frame Allgemeine Java-Themen 6
U Log4j - gleichzeitige geöffnete File handles Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben