Seltsamer Ausgabefehler

Illuminatus0301

Aktives Mitglied
Hallo, ich habe einen seltsamen Fehler. In ein Object hat eine Liste von Integer-Werten (bis zu mehrere tausend - teilweise die Wrete im Tausender-Bereich), die in der Konsole über eine Funktion ausgegeben werden können (zu Test-Zwecken). Die Ausgabe ist so, dass in der ersten Zeile alle Tausender-Stellen der Reihe nach stehen, in der zweiten Zeile die Hunderter, usw.

Richtige Ausgabe (wenn die indexMap einfach mit aufsteigenden Zahlen bis z.B. 1234 gefüllt ist):
0000 ... 1111
0000 ... 2222
0000 ... 3333
0123 ... 1234

Im Verlauf meines Programms wird bei mehreren Objekten die indexMap mit Zahlen gefüllt und ausgeben. Bei ca. 10 Objekten funktioniert das ohne Probleme, nur bei einem Objekt werden keine Ziffern ausgegeben, sondern nur Leerzeichen (bei Eclipse kann ich aber auch genau soviele Leerzeichen markieren, wie Zahlen in der indexMap sind, also wieviele Ziffern da sein sollten).
-Ob es zu Fehlern kommt hab ich mit dem über die Kommentare angedeuteten try-catch-Block überprüft: aber es erscheint nichts udn das Programm macht ohne durch
Code:
System.exit(1);
zu erminieren weiter
-Der System.err-Stream wird im gesamten Programm nicht verändert (System.out schon, aber die 4
Code:
System.out.println();
kommen an)
-Über
Code:
System.out.println(indexMap.size());
außerhalb der Schleifen habe ich überprüft, ob die indexMap leer ist, aber sie ist gefüllt, wie es sein sollte

Was mich richtig verwirrt ist, wenn ich bei jeder Ausgabe noch ein + "," anhänge, funktioniert die Ausgabe in allen Fällen, allerdings mit einem "," zwischen jeder Ziffer. Also wie beim Testfall von oben:
0,0,0,0, ... 1,1,1,1,
0,0,0,0, ... 2,2,2,2,
0,0,0,0, ... 3,3,3,3,
0,1,2,3, ... 1,2,3,4,

Hat da jmd. dafür eine Erklärung? Das kann man bestimmt irgendwie mit Tricksen lösen, aber einen gescheiten Grudn muss es ja geben!

Code:
Java:
public class DieKlasse {
	private ArrayList<Integer> indexMap;

	public void print() {
		//try {
		for(int i = 0; i < indexMap.size(); i++) {
			System.out.print(indexMap.get(i) / 1000 % 10);
		}
		System.out.println("");
		for(int i = 0; i < indexMap.size(); i++) {
			System.out.print(indexMap.get(i) / 100 % 10);
		}
		System.out.println("");
		for(int i = 0; i < indexMap.size(); i++) {
			System.out.print(indexMap.get(i) / 10 % 10);
		}
		System.out.println("");
		for(int i = 0; i < indexMap.size(); i++) {
			System.out.print(indexMap.get(i) % 10);
		}
		System.out.println("");
		//} catch(Exception e) {
			//e.printStackTrace();
			//System.exit(1);
		//}
	}
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
was ist nochmal das Problem?
> nur bei einem Objekt werden keine Ziffern ausgegeben,
Objekt == eine Zahl? in der Liste sind mehrere, bei den meisten klappts, bei einem nicht? am Anfang, in der Mitte, beliebig?

> genau soviele Leerzeichen markieren, wie Zahlen in der indexMap sind
das heißt eine ganze Zeile besteht nur aus Leerzeilen?

ist das reproduzierbar mit einer bestimmten Befüllung der Liste oder zufällig?
hab bei mir bisschen probiert, da ging es immer
 

Illuminatus0301

Aktives Mitglied
Also die Listen werden bei mir durch Strings aus verschiedenen Datein gebildet, und dann im Programm verändert. Bei den ca. 10 Datein, bzw. Strings, bzw. Listen funktioniert alles super, d.h. alle Ziffern werden korrekt angezeigt, nur bei der einen Datei, bzw. String, bzw. Liste (ich glaub die größe, mit 4367 Zeichen, bzw. Elementen, die aber größtenteils auch einfach aufsteigend sind, also 0, 1, 2) funktioniert es bei keiner Zahl. In diesem Fall besteht die ganze Zeile aus Leerzeichen.
Eigentlich kann die
Code:
System.out.print(int i);
Methode doch gar keine Leerzeichen ausgeben, oder?. Und aus den Berechnungen kann auch nur ein
Code:
int
-Wert rauskommen. Die Elemente der Liste sind
Code:
Integer
-Typen, die automatisch zu
Code:
int
-Typen geunboxt werden und die Berechnungen verändern den Typ dann ja auch nicht.
Ich hab auch schon sachen wir
Code:
+ ""
ausprobiert, oder
Code:
String.valueOf(...)
, aber das verändert nichts.
Ich hab jetzt mal die Ausgabe in eine Datei umgeleitet, das funktioneirt ohne Probleme... also alle Ziffern werden korrect angezeigt
Code:
try {
	System.setOut(new PrintStream(new FileOutputStream(new File("test.dat"))));
} catch(Exception e) {
	e.printStackTrace();
}
 
S

SlaterB

Gast
nachvollziehen kann ich es weiter eher nicht, aber paar mögliche Aktione:
ist das ganze reproduzierbar, passiert es immer mit der bestimmten Datei?
dann poste das exakte Programm und die fragliche Datei als Anhang,

du kannst in Eclipse noch auf die Konsole rechtsklicken und paar Einstellungen vornehmen, etwa den Buffer/ Cache erhöhen,
sonst wird bei Programmen mit langen Ausgaben nur der letzte Rest angezeigt

modifiziere die Ausgabe etwas, zwischen jeder Zeile ein "huhu", nach 10 Zeichen ein "c" einbauen,
um zu verifizieren, dass es genau diese Stelle ist und ansonsten dort alles funktioniert

geht es wenn du das Programm auf der Betriebssystem-Konsole statt in Eclipse ausführst? geht es wenn du die Information in einem String/ StringBuilder speicherst und später analysierst?
ok, mit Dateiausgabe hast du ja schon ähnliches als Bestätigung..
 

Illuminatus0301

Aktives Mitglied
Ich weiß sicher, dass der Output an dieser Stelle kommt, da in der Methode noch andere Sachen ausgegeben werden (was aber ohne Probleme funktioniert - deswegen hab ic hes weggelassen)

Die Datei, die die Probleme macht, ist die letzte, die bearbeitet wird, also passt der Output auch noch in die Konsole (ich seh davor und dahinter was richtiges)

Direkt davor wird der String, zu der die indexMap ist, ausgegeben (
Code:
indexMap.size() == string.length()
), und alle Zeichen werden korrekt angezeigt, also kann es auch nicht daran liegen, dass Eclipse so lange Zeilen nicht anzeigen kann

Wenn ich das Program über die Windows-Konsole starte, funktioniert alles, allerdings leidet die Performance erheblich darunter, wenn ich die Fensterpufferbreite auf 5000 stelle...

Das ganze ist voll reproduzierbar, heißt es passiert immer, das ganze Programm kann ich nicht Uploaden, da das den Rahmen sprengen würde (Quelldatein insgesamt ca 8MB groß).

Ich vermute jetzt einmfach mal, dass das irgendein BufferOverflow oder was ähnliches in Eclipse sein wird, der Angefangen aber sonst nicht angezeigt wird und werde wenns drauf ankommt einfach über die Windows-Konsole arbeiten.

Vielen Dank für die Hilfe trotzdem
 
S

SlaterB

Gast
wenn du den Fehler in Eclipse vermutest, dann sollte dieses sich kaum für deine Programmgröße interessieren, ansonsten wäre es ja hochkomplex,
geht man von einem einfachen Eclipse-Fehler aus, kannst du also versuchen, dein Programm Schritt für Schritt zu verkleinern,
bzw. erst einmal mit einem 100 Zeilen-Programm anfangen, zum Code des ersten Postings fehlt ja quasi nur noch das Datei-einlesen,

wenn das geht, dann den anderen Weg vom 8 MB-Programm aus, erstmal 95% nicht beteiligten Rest streichen, danach auch relativ flott von 1000 Zeilen auf 500, 250 usw.,
wenn du siehst dass das Streichen irgendeines Programmteils (etwa die Erzeugung der Datei in den ersten 95%) die Reproduzierbarkeit des Fehlers verhindert, dann ist schon Information gewonnen,

das heißt nicht dass es nicht trotzdem ein Eclipse-Fehler ist,

letztlich kann das alles aber auch egal, die Suche die Zeit nicht Wert sein
 

Ähnliche Java Themen

Neue Themen


Oben