Programmverhalten in IDE anders als bei externen Programmen

Status
Nicht offen für weitere Antworten.

micbur

Bekanntes Mitglied
Hallo,

ich bin auf der Suche nach einem komischen Bug und habe dabei ein merkwürdiges Verhalten beobachtet.
Also mein Bug war Folgendes:
Ich lese mit einem Java-Programm einzeln Dateien ein. Der Inhalt wird nach bestimmten Kriterien gefiltert und der Rest wird in eine neue Datei geschrieben. Nun kommt mein Bug ins Spiel. Dieses Verhalten tritt bei allen Dateien, außer der ersten auf.
Es werden die letzten sieben Zeilen der vorigen Datei an den Anfang der folgenden Datei geschrieben. Ich benutze in meinem Programm eine Queue, als Datenstrucktur eine ArrayList. Diese ArrayList soll maximal 30 Elemente lang werden. Wird ein Element an eine 30-elementige Queue gehangen, wird das erste Element gelöscht.

Kann es sein, dass eine ArrayList initial von der JVM eine Länge von sieben bekommt?

Code:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.Pattern;

public class LogLineQueue {
	
	private int queuelength = 30;
	private ArrayList queue = null;
	private ArrayList garbage = null;
	
	public LogLineQueue() {
		this.queue = new ArrayList(this.queuelength); 
		this.garbage = new ArrayList(0);
	}
	
	public LogLineQueue(int length) {
		this.queuelength = length;
		this.queue = new ArrayList(this.queuelength);
		this.garbage = new ArrayList(0);
	}

	public int getQueuelength() {
		return queuelength;
	}

	public void setQueuelength(int queuelength) {
		this.queuelength = queuelength;
	}
	
	/** 
	 * enqueue() schiebt Elemente wieder raus, wenn
	 * Elemente hinzugefügt werden!
	 * Vorne anfügen, hinten rausfallen. FIFO! 
	 * */
	public LogLine[] enqueue(LogLine obj) {
		
		ArrayList output_list = new ArrayList(0);
		LogLine[] out = null;
		
		while (this.queue.size() >= this.queuelength) {
			output_list.add(this.queue.get(0));
			this.queue.remove(0);
		}
		
		// conditions prüfen
		// hier werden die einzelnen Zeilen auf this.queue oder this.garbage verteilt
		// es wird this.queue.add(Object) und this.garbage.add(Object) benutzt

        // Work-A-Round, als Array von der ArrayList zurückbekommen hat nicht funktioniert, wird mit O(n) Aufwand selbst gemacht. 
		out = new LogLine[output_list.size()];
		for (int i = 0; i < output_list.size(); i++) {
			out[i] = (LogLine) output_list.get(i);
		}
		for (int i = 0; i < output_list.size(); i++ ) {
			output_list.remove(0);
		}
		return out;

	}
	
	public boolean contains(LogLine arg) {
		LogLine current = null;
		Iterator i = this.queue.iterator();
		while (i.hasNext()) {
			current = (LogLine) i.next();
			if (current.compareTo(arg) == 0) {
				return true;
			}
		}
		return false;
	}
	
	public LogLine[] getGarbage() {
		
		LogLine[] out = new LogLine[garbage.size()];
		for (int i = 0; i < garbage.size(); i++) {
			out[i] = (LogLine) this.garbage.get(i);
		}
		for (int i = 0; i < this.garbage.size(); i++) {
			this.garbage.remove(0);
		}
		
		this.garbage = null;
		this.garbage = new ArrayList(0);
		
		return out;
	}
	
	public LogLine[] empty() {
		LogLine[] out = new LogLine[this.queue.size()];
		for (int i = 0; i < this.queue.size(); i++) {
			out[i] = (LogLine) this.queue.remove(0);
		}
		for (int i = 0; i < this.queue.size(); i++) {
			this.queue.remove(0);
		}
		this.queue = null;
		this.queue = new ArrayList(0);
		
		return out;
	}
	

}

Aufgerufen wird diese Klasse in einem Thread

Code:
public void run() {

		BufferedReader readfilein  = null;
		BufferedWriter new_logfile = null;
		BufferedWriter garbagefile = null;
		String one_line            = null;

		LogLine[] loglines_arr     = null;
		StringBuffer buffer        = new StringBuffer();
		LogLine current            = null;

		int processed = 0;
		int filtered  = 0;

		try {
			readfilein = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(this.logfilename))));
			new_logfile = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.logfilename + ".mod")));

			one_line = readfilein.readLine();

			while(one_line != null) {

				current = new LogLine(one_line);
				// work-a-round für Logzeilen, die kürzer als 14 Spalten sind, z.B. Headerzeilen der Logfiles
				/*
				public class LogLine implements Comparable {
				    private String payload  = null;
				    private String timestamp = null;
				...
			    }
				*/
				if (current.getPayload() == null) {
					current.setTimestamp("");
					current.setPayload(one_line);
				}

				// die erzeugte LogLine zur Queue hinzufügen
				// Rückgabewert der Queue ist der Überhang der Queue. 
				// Regel: Wird das 31te Element an eine 30-stellige Queue übergeben, fällt das erste Element raus. 
				loglines_arr = this.window.enqueue(current);

				// Queue zurück in das neue Log schreiben
				for (int i = 0; i < loglines_arr.length; i++ ) {
					if (loglines_arr[i] != null) {
						processed++;
						buffer.append(loglines_arr[i].getLogline() + System.getProperty("line.separator", "\n\r"));
					}
				}

				// da zuerst ein Buffer gefüllt wird, muss dieser immer zurück in Dateien geschrieben werden. 
				// Der Buffer soll eine bestimmte Mindestgröße erreichen, bevor er geschrieben wird. 
				if (buffer.length() > this.writeBufferSize) {
					new_logfile.write(buffer.toString());
					buffer.delete(0, buffer.length());
					new_logfile.flush();
				}
				new_logfile.flush();

				// erneut eine Zeile einlesen, Scheife nochmal durchlaufen
				one_line = readfilein.readLine();
			}

			new_logfile.write(buffer.toString());
			buffer.delete(0, buffer.length());

			// die letzten LogLines aus der Queue holen & in den Buffer schrieben
			loglines_arr = this.window.empty();
			for (int i = 0; i < loglines_arr.length; i++ ) {
				if (loglines_arr[i] != null) {
					processed++;
					buffer.append(loglines_arr[i].getLogline() + System.getProperty("line.separator", "\n\r"));
				}
			}
			new_logfile.flush();

			new_logfile.write(buffer.toString());
			buffer.delete(0, buffer.length());
			buffer = new StringBuffer("");
			buffer = null;
			new_logfile.flush();
			new_logfile.close();

			this.filtered_counter = filtered;
			this.processed_counter = processed;
			
		} 
		catch (IOException e) {
			e.printStackTrace();
		}
		
	}

Vielleicht sieht ja jemand meinen Bug. Ich habe ihn nicht gefunden bisher.

Dann zum Verhalten der IDE. Wenn ich mein bugbehaftetes Programm in der IDE ablaufen lasse, dann gibt es den Fehler nicht. Alle Zeilen sind in den Dateien, wo sie hin sollen. Ich benutze Eclipse 3.1 auf Java 1.5.0 Update 6.


Ciao, micbur
 

Wildcard

Top Contributor
Ist mir jetzt zu viel Code zum auf die schnelle durchgehen.
Versuch erstmal mittles Debugger das Problem einzugrenzen.
Zu deiner Frage:
Wenn du keinen Paramter übergibst der das Defaultverhalten ändert wird eine ArrayList mit 10 initialisiert.
 

micbur

Bekanntes Mitglied
Hallo,

der Debugger bringt mir leider nichts. Der läuft ja auch in der IDE und da taucht kein Fehler auf ;-)

Schade.

Ciao, micbur
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Mergesort (aber anders) Java Basics - Anfänger-Themen 2
HelpInneed Baum ausgeben (aber mal anders) Java Basics - Anfänger-Themen 3
L Warum ist die Ausgabe anders als das was im Bezeichner steht? Java Basics - Anfänger-Themen 4
S CSV Datei auslesen und anders darstellen Java Basics - Anfänger-Themen 2
J Umwandlung String zu ASCII-Wert und anders Java Basics - Anfänger-Themen 17
C Scannermethode mal anders?! Java Basics - Anfänger-Themen 5
E Input/Output Switch ausgabe anpassen bzw. anders darstellen Java Basics - Anfänger-Themen 13
C Implizite Typumwandlung nach Java 8 anders? Java Basics - Anfänger-Themen 7
U Interface Schriftfarbe von Benutzer anders als vun Computer/Code Java Basics - Anfänger-Themen 6
S Programm verhält sich in Eclipse anders, als ein eigenständiges Programm Java Basics - Anfänger-Themen 5
I Ausgabe in verschiedenen Entwicklungsumgebungen anders Java Basics - Anfänger-Themen 6
R Methoden Main-Methode verhält sich in .jar anders als in Eclipse Java Basics - Anfänger-Themen 2
K wie Datum in JTable anders anzeigen lassen Java Basics - Anfänger-Themen 2
G JTextArea: nur bestimmte Zeilen anders formatieren Java Basics - Anfänger-Themen 7
P Variablen Guthaben anders definieren Java Basics - Anfänger-Themen 7
C ASCII CODES in Linux anders als auf Windows? Java Basics - Anfänger-Themen 4
B Rechnung per Hand anders als von Java Java Basics - Anfänger-Themen 6
-horn- Zeilenweises Speichern bei Win und Linux anders? Wie bitwises Angleichen? Java Basics - Anfänger-Themen 3
M .jar file verhält sich anders... Java Basics - Anfänger-Themen 28
N Applet verhält sich anders Java Basics - Anfänger-Themen 6
A Ausgabe immer anders, synchronisation? Java Basics - Anfänger-Themen 2
M Producer / Consumer mal anders. Java Basics - Anfänger-Themen 7
L Code verhält sich in JUnit anders als in normaler Klasse Java Basics - Anfänger-Themen 2
G Was würdet ihr besser/anders machen? Java Basics - Anfänger-Themen 9
L Datei kopieren in anders verzeichnis geht nicht Java Basics - Anfänger-Themen 17
G Version von Anwendung mit Eclipse oder anders festlegen Java Basics - Anfänger-Themen 8
M Array anders sortieren, aber die Reihenfolge beibehalten Java Basics - Anfänger-Themen 4
F TXT Dateien mal anders lesen Java Basics - Anfänger-Themen 11
P Suchen-Ersetzen mal anders(?) Java Basics - Anfänger-Themen 16
J Muss ich die externen jars mitgeben? Java Basics - Anfänger-Themen 8
B OOP While Schleife läuft Endlos durch externen aufruf Java Basics - Anfänger-Themen 2
Silvascus Inhalt eines externen Textdokuments an einen String übergeben Java Basics - Anfänger-Themen 2
M Input/Output Kommunikation mit externen Geräten Java Basics - Anfänger-Themen 0
M Welche externen Bibliotheken sind in Java sehr zu empfehlen? Java Basics - Anfänger-Themen 4
G Externen Button drücken Java Basics - Anfänger-Themen 9
B JAR mit externen JARs in eclipse erstellen Java Basics - Anfänger-Themen 5
C Mit Java Textfeld einer externen Anwendung auslesen Java Basics - Anfänger-Themen 9
A Problem beim Ausführen einer .jar datei auf externen System Java Basics - Anfänger-Themen 5
F Problem mit externen Grafiken und Eclipse Java Basics - Anfänger-Themen 20
R Drucken mithilfe eines Externen ActionListeners Java Basics - Anfänger-Themen 17
M externen Pfad in Jar verwenden Java Basics - Anfänger-Themen 3
J externen code ausführen Java Basics - Anfänger-Themen 8
T Netbeans: Import von Externen Packet Java Basics - Anfänger-Themen 5
G Externen Prozess starten - entweder stdin oder stderr auslesen Java Basics - Anfänger-Themen 3
Ollek Erstellen einer ausführbaren JAR-Datei mit externen Libaries Java Basics - Anfänger-Themen 9
A Aufruf einer externen schon laufenden Anwendung Java Basics - Anfänger-Themen 3
G JUnit4 mit externen Objecten/Dateien Java Basics - Anfänger-Themen 5
zilti Externen Java-Code laden Java Basics - Anfänger-Themen 3
A Methoden von externen Klassen aufrufen Java Basics - Anfänger-Themen 3
S externen Programmpfad auslesen Java Basics - Anfänger-Themen 4
W Start-Probleme mit externen Bibliotheken / JAR-Bildung Java Basics - Anfänger-Themen 2
A Interaktionen mit externen programmen Java Basics - Anfänger-Themen 21
P Externen Proceß starten und warten bis beendet? Java Basics - Anfänger-Themen 2
P Problem: Kann keine externen Pakete importieren Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben