StackOverflowError, finde den Fehler nicht

xyt4n

Aktives Mitglied
Hallo nochmal,

also ich habe ein Program geschrieben, das fast vollständig funktioniert. Kurz dazu: 2 Arrays werden lexigrofisch vergleicht.
Leider im Falle a[]=b[] stürzt das Programm ab, da ein Overstockflow fehler passiert. Wobei das m.M.n. gar nicht passieren könnte wegen dem Befehl in Zeile 24

Ich stelle jetzt nur 3 Methoden rein, zum Verständnis und da der Rest m.M.n. entweder richtig ist oder zu komplett anderen Algorithmen gehört.

Java:
	public static int compareArrays(int[] a, int[] b) {

		if (a.length == 0 && b.length > 0)
			return -1;
		else if (a.length == 0 && b.length == 0)
			return 0;
		else if (a.length > 0 && b.length == 0)
			return 1;
		else if (a[0] < b[0])
			return -1;
		else if (a[0] == b[0])
			return compareArrays(tail(a), tail(b));
		else if (a[0] > b[0])
			return 1;
		return 0;
	}

	public static int[] tail(int[] a) {
		if (a.length > 1) {
			for (int i = 1; i < a.length; i++)
				a[0] = a[i];
			return a;
		}
		int b[] = {}; // Fuer den letzten Durchlauf bei Länge 1
		return b;

// mehrere Methoden wie cut usw.

	public static void main(String[] args) {
		int[][] a1 = { { 0, 2, 3 }, { 0, 2, 3, 8 } };
		int[][] a2 = { { 3, 4, 7, 8 }, { 3, 4, 8, 0 } };
		int[][] a3 = { { 7, 8 }, { 7, 8 } };
		System.out.println(compareArrays(cut1(a1), cut2(a1)));
		System.out.println(compareArrays(cut1(a2), cut2(a2)));
		System.out.println(compareArrays(cut1(a3), cut2(a3))); //Fehler!! Overstockflow

// mehrere weitere Methoden die nicht zum Problem gehören 
}

}
	}
 

Ark

Top Contributor
Der Java-Compiler nimmt keine Tail-Recursion-Optimizations vor. Du wirst also dein
Code:
return compareArrays(tail(a), tail(b));
zu einer geeigneten Schleife umschreiben müssen.

Dein Code erinnert zwar ganz stark an funktionale Programmierung, aber auf diese Weise wird man in Java nicht weit kommen. (Was nicht heißen soll, dass es keine anderen Konstrukte in Java gäbe, die funktional aussehen, und ebensowenig sei damit die funktionale Programmierung als solche abgewertet.)

Ark
 

xyt4n

Aktives Mitglied
Der Java-Compiler nimmt keine Tail-Recursion-Optimizations vor. Du wirst also dein
Code:
return compareArrays(tail(a), tail(b));
zu einer geeigneten Schleife umschreiben müssen.

Dein Code erinnert zwar ganz stark an funktionale Programmierung, aber auf diese Weise wird man in Java nicht weit kommen. (Was nicht heißen soll, dass es keine anderen Konstrukte in Java gäbe, die funktional aussehen, und ebensowenig sei damit die funktionale Programmierung als solche abgewertet.)

Ark

Okay, gibt es also keinen genauen Fehler? Es ist komisch da der Befehl return compareArrays(tail(a), tail(b)); 1zu1 von meinem Prof erwartet wird :/

Was meinst du mit der Kritik an meinen Programmierstil? Soll ich etwa objektorientierter arbeiten? Bin erst Erstsemestler.
 

Ark

Top Contributor
Okay, ich gebe zu, ich habe wohl was übersehen. Hier mal eine (hoffentlich funktionierende) Korrektur:
Java:
	public static int[] tail(int[] a) {
		int b[] = new int[a.length - 1]; // fails if a is empty or null
		for (int i = 0; i < b.length; i++){
			b[i] = a[i + 1];
		}
		return b;
	}
[EDIT]Dennoch wird man mit diesem Stil in Java nur eher selten (etwa in speziellen Multithreading-Szenarien) auf einen grünen Zweig kommen. Ach, ja, und "Overstockflow" klingt nach DAX-Allzeithoch. :D[/EDIT]
Ark
 
Zuletzt bearbeitet:

xyt4n

Aktives Mitglied
Okay, ich gebe zu, ich habe wohl was übersehen. Hier mal eine (hoffentlich funktionierende) Korrektur:
Java:
	public static int[] tail(int[] a) {
		int b[] = new int[a.length - 1]; // fails if a is empty or null
		for (int i = 0; i < b.length; i++){
			b[i] = a[i + 1];
		}
		return b;
	}
[EDIT]Dennoch wird man mit diesem Stil in Java nur eher selten (etwa in speziellen Multithreading-Szenarien) auf einen grünen Zweig kommen. Ach, ja, und "Overstockflow" klingt nach DAX-Allzeithoch. :D[/EDIT]
Ark

Super! Auch wenn ich nicht weiß wieso meins falsch ist.
Vielen Dank!

Aber was für ein Problem gibt es mit meinem Programmierstil?
Ich will langfristig gut programmieren können, darum würde es mich sehr interessieren was du meinst.
Das einzigste was mir einfallen würde wäre Ineffizienz, wobei es für mich auch ein schweres Thema ist.
 

Ark

Top Contributor
Super! Auch wenn ich nicht weiß wieso meins falsch ist.
Sieh mal genau hin, welche Länge das Array hat, das du in deiner ursprünglichen tail()-Implementierung zurückgegeben hast.

Aber was für ein Problem gibt es mit meinem Programmierstil?
Ich will langfristig gut programmieren können, darum würde es mich sehr interessieren was du meinst.
Das einzigste was mir einfallen würde wäre Ineffizienz, wobei es für mich auch ein schweres Thema ist.
Dito. An der Quelltext-Formatierung gibt es fast nichts auszusetzen.* Das ständige Hin- und Herkopieren ist allerdings nur selten wirklich nützlich. Auch unnötige Endrekursionen sollten vermieden werden (zumindest bei Sprachen, bei denen das nicht vom Compiler in eine Schleife umgebaut wird). Das hat alles etwas mit dem Laufzeitverhalten zu tun (Stichwort: Komplexität).

Der Code erinnert ein wenig an den Versuch (eines Profs?), das Gefühl von funktionaler Programmierung von Java zu bekommen. Wenn du eher funktional programmieren willst/sollst, wäre z.B. Haskell wesentlich geeigneter.

Als Anfänger ist es aber tatsächlich wichtiger, das Schreiben von korrektem Code zu üben (was nicht heißen soll, dass dies später nicht auch wichtig wäre). Tendentiell, so meine Erfahrung, ist korrekter Code meist klarer/einfacher/übersichtlicher als eine (frühere) fehlerhafte Implementierung.** Auch in dem Punkt lohnt ein Blick zu Haskell. Insofern: Mach einfach weiter, so schlecht sieht das für den Anfang gar nicht aus. Sei dir aber dessen bewusst, dass da noch viel Luft ist, um das Laufzeitverhalten zu verbessern. ;)



*: Mehr {…} würden deinem Code durchaus guttun. Vor allem Schleifen sollten immer mit einem Anweisungsblock versehen werden. Bei if/else sehe ich das dagegen nicht so eng, vor allem nicht bei
Code:
return
,
Code:
throw
,
Code:
break
,
Code:
continue
. Wo andere lieber
Java:
if(abc) {
	return 0;
}
schreibe ich eben
Java:
if(abc) return 0;
Dieser Schreibstil ist zwar nicht allzu verbreitet, spart aber viele fast leere Zeilen. Versehentlich die Klammern {…} zu vergessen, wenn man Anweisungen hinzufügen möchte, ist so auch eher unwahrscheinlich, weil man dazu entweder noch einen Zeilenumbruch einarbeiten müsste oder mehrere Anweisungen in eine Zeile schreiben würde (und das wird man wohl noch mitkriegen).


**: Darüber hinaus gibt es in sauberem und korrektem Code meist viel Spielraum für Performance-Optimierungen.

Ark
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
ashi StackOverflowError Java Basics - Anfänger-Themen 3
H Collections StackOverflowError in einer Queue Java Basics - Anfänger-Themen 3
F Exception in thread main java.lang.StackOverflowError Java Basics - Anfänger-Themen 3
J StackOverflowError Java Basics - Anfänger-Themen 9
D StackOverflowError Java Basics - Anfänger-Themen 8
U KeyListener StackOverflowError Java Basics - Anfänger-Themen 2
A stackOverFlowError Java Basics - Anfänger-Themen 11
G Rekursives aufrufen führt zu StackOverflowError Panel durchl Java Basics - Anfänger-Themen 5
F Wieso java.lang.StackOverflowError (minimales programm) Java Basics - Anfänger-Themen 11
R StackOverflowError bei Rekursion Java Basics - Anfänger-Themen 7
M java.lang.StackOverflowError Java Basics - Anfänger-Themen 2
M StackOverflowError Java Basics - Anfänger-Themen 6
G StackOverflowError Java Basics - Anfänger-Themen 2
S StackOverflowError Java Basics - Anfänger-Themen 16
S StackOverflowError Java Basics - Anfänger-Themen 2
R StackOverflowError Java Basics - Anfänger-Themen 7
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
monsterherz if / else if mit Fehler den ich leider nicht finde Java Basics - Anfänger-Themen 11
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
W Verschachtelte If-else --> finde meinen Fehler nicht Java Basics - Anfänger-Themen 30
B ArrayIndexOutOfBoundsException, ich finde den Fehler nicht? Java Basics - Anfänger-Themen 10
A Kalender programmieren, ich finde meinen Fehler nicht. Java Basics - Anfänger-Themen 9
Z Montageberechnungs programm, finde leider den Fehler nicht Java Basics - Anfänger-Themen 13
S Finde den fehler nicht Java Basics - Anfänger-Themen 1
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
M Methoden Fehler und finde die Lösung nicht wirklich Java Basics - Anfänger-Themen 6
T Input/Output Leerzeilen in Ausgabe -> finde den Fehler nicht Java Basics - Anfänger-Themen 10
Z Finde den Fehler nicht ! Java Basics - Anfänger-Themen 3
X Finde die Files über FTP nicht Java Basics - Anfänger-Themen 4
T Wie finde ich passende Java Klassen & Methoden? Java Basics - Anfänger-Themen 4
S Compiler-Fehler Finde den Fehler nicht... Java Basics - Anfänger-Themen 4
L Methoden Finde Secquenz ineinem array Java Basics - Anfänger-Themen 12
S Compiler-Fehler error: ';' expected (finde Fehler nicht) Java Basics - Anfänger-Themen 10
O Verriegeln, aber wo? Finde den Client der zu schließem ist. Java Basics - Anfänger-Themen 0
D Code Fehlerhaft finde den Fehler nicht. Java Basics - Anfänger-Themen 1
Farbenfroh Exceptions Anfänger - Finde Fehler nicht Java Basics - Anfänger-Themen 7
R Finde den Fehler nicht Java Basics - Anfänger-Themen 4
A finde fehler nicht Java Basics - Anfänger-Themen 9
M Methoden Fehler in Methode - Finde ihn nicht Java Basics - Anfänger-Themen 7
P Benötige Hilfe - finde Fehler nicht. Java Basics - Anfänger-Themen 3
J "ArrayIndexOutOfBoundsException", finde den Fehler schlicht nicht Java Basics - Anfänger-Themen 6
D Wo finde ich die OpenSource-Sources? Java Basics - Anfänger-Themen 5
V finde meinen Fehler nicht Java Basics - Anfänger-Themen 10
B Finde BUG nicht... Java Basics - Anfänger-Themen 8
L StackOverFlow, finde Grund nicht! Java Basics - Anfänger-Themen 5
M Ganz einfaches Beispiel, finde den Fehler aber nicht :( Java Basics - Anfänger-Themen 2
Z Problem mit Tutorial - Finde Kon.java nicht Java Basics - Anfänger-Themen 11
J Finde Fehler bei kleinem Programm nicht Java Basics - Anfänger-Themen 3
V Ganz kurze Java-Hilfe - Ich finde meinen Fehler nicht Java Basics - Anfänger-Themen 4
B Wie finde ich Exceptions? Java Basics - Anfänger-Themen 19
S Out of bounds exception. Finde den fehler nicht Java Basics - Anfänger-Themen 13
U finde fehler nicht! bitte um hilfe Java Basics - Anfänger-Themen 8
C ich finde den fehler nicht Java Basics - Anfänger-Themen 4
J Finde die Fehler nicht Java Basics - Anfänger-Themen 2
L Illegal Start of Type, wie finde ich den fehler Java Basics - Anfänger-Themen 4
M Finde Fehler nicht: NotSerializableException Java Basics - Anfänger-Themen 2
F Finde den Fehler nicht Java Basics - Anfänger-Themen 4
J class, interface, or enum expected - finde Fehler nicht. Java Basics - Anfänger-Themen 4
E Finde Error nciht Java Basics - Anfänger-Themen 3
U Finde den fehler nicht Java Basics - Anfänger-Themen 9
J Kann den fehler nicht finde!!! Java Basics - Anfänger-Themen 7
B Calculator Fehlermeldung ich finde aber nichts? Java Basics - Anfänger-Themen 2
S Finde den Fehler nicht/ verstehe Anweisung nicht Java Basics - Anfänger-Themen 12
S Finde den Fehler nicht ! Java Basics - Anfänger-Themen 8
K class Enum Methode: values() - finde ich nicht in der API Java Basics - Anfänger-Themen 2
W Java Anfänger... Finde fehler nicht Java Basics - Anfänger-Themen 11
B Java programm mit Arrays. finde den Fehler nicht Java Basics - Anfänger-Themen 3
U Finde den fehler nicht Java Basics - Anfänger-Themen 10
U Finde den fehler nicht Java Basics - Anfänger-Themen 6
C Finde meinen Fehler nicht Java Basics - Anfänger-Themen 6
A Finde javax.servlet.* nicht Java Basics - Anfänger-Themen 6
F Finde fehler nicht Java Basics - Anfänger-Themen 5
N finde die fehler nicht Java Basics - Anfänger-Themen 9
G Bild wird nicht neu gezeichnet - finde den Fehler nicht Java Basics - Anfänger-Themen 3
G wie finde ich workspace programmatisch? Java Basics - Anfänger-Themen 13
G Wie finde ich das Verzeichnis von meinen Java Projekt? Java Basics - Anfänger-Themen 7
S Finde den Fehler nicht Java Basics - Anfänger-Themen 13
H Finde Position Java Basics - Anfänger-Themen 4
J wo finde ich javah Java Basics - Anfänger-Themen 16
B wo finde ich diese Dateien? Java Basics - Anfänger-Themen 6
B Wo finde ich die Klasse javax.sound.sampled.AudioSystem Java Basics - Anfänger-Themen 7
G wie finde ich den pfad meines programms raus? Java Basics - Anfänger-Themen 2
T ArrayIndexOutOfBoundsException finde den Auslöser nicht Java Basics - Anfänger-Themen 5
O problem mit document listener finde den fehler nicht Java Basics - Anfänger-Themen 2
O arrayindexoutofbounds finde den fehler nicht Java Basics - Anfänger-Themen 6
B Finde das Problem nicht! Java Basics - Anfänger-Themen 2
R Finde meinen Fehler nicht! - Namen von Personen vergleichen Java Basics - Anfänger-Themen 6
M Finde den Fehler nicht Java Basics - Anfänger-Themen 3
B Finde Methode einer Klasse nicht Java Basics - Anfänger-Themen 4
N Finde Fehler nicht! Help plz! Java Basics - Anfänger-Themen 3
F Kleiner Fehler, den ich aber leider nicht finde. Java Basics - Anfänger-Themen 4
F Erste Schritte in Java - Wo finde ich Antworten? Referenzbib Java Basics - Anfänger-Themen 3
B Wo finde ich eine Übersicht aller Methoden? Java Basics - Anfänger-Themen 2
J wo finde ich die methode addactionlistener in der api ? Java Basics - Anfänger-Themen 5
F Kann mir jemand bei dem Fehler helfen? Java Basics - Anfänger-Themen 6
Juelin jedit Fehler beim starten Java Basics - Anfänger-Themen 2
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
E Matrizenmultiplikation Fehler Java Basics - Anfänger-Themen 0
Z Fehler Zeiterfassungsprogramm Anzeige Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben