Datentypen NPE in längerer Methode

X

Xyz1

Gast
Hallo, also mal vorweg, es ist eine längere Methode geworden, welche mir jetzt Kopfweh bereitet. Code:
Java:
	LinkedHashMap<Long, Sys> systems = new LinkedHashMap<>();
	LinkedHashMap<Long, Sta> stations = new LinkedHashMap<>();
	LinkedHashMap<Long, Lis> listings = new LinkedHashMap<>();

	float ...;
	float ...;
	float ...;
	int ...;
	int ...;

// ...

	ArrayList<Lis[]> getAlgo2(App app) {
		ArrayList<Sys> sl = new ArrayList<>();
		for (Sys s : systems.values()) {
			if (getDisToSol(s) < maxDisToSol) {
				sl.add(s);
			}
		}
		ArrayList<Lis[]> results1 = new ArrayList<Lis[]>();
		ArrayList<Lis[]> results2 = new ArrayList<Lis[]>();

		getAlgo2(sl, results1, results2, new Lis[4], false, 0, 3, new HashSet<Long>());

		ArrayList<Lis[]> results = new ArrayList<>();
		results.addAll(results1);
		results.addAll(results2);
		return results;
	}

	//////////

	void getAlgo2(ArrayList<Sys> sl, ArrayList<Lis[]> results1, ArrayList<Lis[]> results2, Lis[] res, boolean planets,
			int index, int n, HashSet<Long> used) {
		if (index == n) {
			if (planets) {
				if (results1.isEmpty() || compareListings2(res, results1.get(results1.size() - 1)) < 0) {
					if (results1.size() == 100) {
						results1.remove(results1.size() - 1);
					}
					Lis[] l = new Lis[n + 1];
					System.arraycopy(res, 0, l, 0, n + 1);
					results1.add(l);
					Collections.sort(results1, (Lis[] l1, Lis[] l2) -> compareListings(l1, l2));
				}
			} else {
				if (results2.isEmpty() || compareListings2(res, results2.get(results2.size() - 1)) < 0) {
					if (results2.size() == 100) {
						results2.remove(results2.size() - 1);
					}
					Lis[] l = new Lis[n + 1];
					System.arraycopy(res, 0, l, 0, n + 1);
					results2.add(l);
					Collections.sort(results2, (Lis[] l1, Lis[] l2) -> compareListings(l1, l2));
				}
			}
			return;
		}
		if (index == 0) {
			for (Sys sys : sl) {
				if (!used.contains(sys.id)) {
					used.add(sys.id);
					for (Sta sta : sys.stations) {
						for (Lis lis : sta.listings) {
							if (lis.buy_price > 0 && lis.supply >= minSupDem) {
								res[index] = lis;
								if (sta.isPlanetary)
									getAlgo2(sl, results1, results2, res, true, index + 1, n, used);
								else
									getAlgo2(sl, results1, results2, res, planets, index + 1, n, used);
							}
						}
					}
					used.remove(sys.id);
				}
			}
		} else {
			Lis lis1 = res[index - 1];
			Sta sta1 = stations.get(lis1.station_id);
			Sys sys1 = systems.get(sta1.system_id);
			for (Sys sys : sl) {
				if (!used.contains(sys.id)) {
					used.add(sys.id);
					for (Sta sta : sys.stations) {
						Lis lis2 = sta.listingsMap.get(lis1.com_id);
						if (lis2 != null && lis1.buy_price > 0 && lis1.buy_price < lis2.sell_price
								&& lis1.supply >= minSupDem && lis2.demand >= minSupDem) {
							for (Lis lis : sta.listings) {
								if (lis.buy_price > 0 && lis.supply >= minSupDem) {
									res[index] = lis2;
									res[index + 1] = lis;
									if (sta.isPlanetary)
										getAlgo2(sl, results1, results2, res, true, index + 2, n, used);
									else
										getAlgo2(sl, results1, results2, res, planets, index + 2, n, used);
								}
							}
						}
					}
					used.remove(sys.id);
				}
			}
		}
	}

	//////////

	int compareListings2(Lis[] a, Lis[] b) {
		int sum1 = 0;
		for (int i = 0; i < a.length - 1; i += 2) {
			sum1 += a[i + 1].sell_price - a[i].buy_price;
		}
		int sum2 = 0;
		for (int i = 0; i < b.length - 1; i += 2) {
			sum2 += b[i + 1].sell_price - b[i].buy_price;
		}
		return Integer.compare(sum1, sum2);
	}


Ich rufe getAlgo2 auf... und die NPE tritt hier in Zeile 111 auf (sum1 += a[i + 1].sell_price - a[i].buy_price; , ne es ist jetzt Zufall, dass es gerad Zeile 111 ist).

Habt ihr eine Idee wieso? Wenn (index == n) dann sollte res eigentlich nicht leer sein.
 
X

Xyz1

Gast
Wenn keiner herausfindet, weswegen die NPE in der Methode compareListings2() und getAlgo2() auftritt, also wo ich en Check vergessen hatte, dann kann das Thema wieder gelöscht werden.
Ich bedanke mich dennoch.
 
X

Xyz1

Gast
Fand gerade heraus, woran es lag; 4 sachen die indices betreffend waren falsch :D
Java:
	ArrayList<Lis[]> getAlgo2(App app) {
		int n = 5;

		ArrayList<Sys> sl = new ArrayList<>();
		for (Sys s : systems.values()) {
			if (getDisToSol(s) < maxDisToSol) {
				sl.add(s);
			}
		}
		ArrayList<Lis[]> results1 = new ArrayList<Lis[]>();
		ArrayList<Lis[]> results2 = new ArrayList<Lis[]>();

		getAlgo2(sl, results1, results2, new Lis[n], false, 0, n - 1, new HashSet<Long>()); // array with exact 5
																							// elements...

		ArrayList<Lis[]> results = new ArrayList<>();
		results.addAll(results1);
		results.addAll(results2);
		return results;
	}

	//////////

	void getAlgo2(ArrayList<Sys> sl, ArrayList<Lis[]> results1, ArrayList<Lis[]> results2, Lis[] res, boolean planets,
			int index, int n, HashSet<Long> used) {
		if (index > n) { // index must be 2 greater than n...
			if (planets) {
				if (results1.isEmpty() || compareListings2(res, results1.get(results1.size() - 1)) < 0) {
					if (results1.size() == 100) {
						results1.remove(results1.size() - 1);
					}
					Lis[] l = new Lis[n + 1];
					System.arraycopy(res, 0, l, 0, n + 1);
					results1.add(l);
					Collections.sort(results1, (Lis[] l1, Lis[] l2) -> compareListings2(l1, l2)); // use strictly
																									// compareListings2
																									// instead of 1...
				}
			} else {
				if (results2.isEmpty() || compareListings2(res, results2.get(results2.size() - 1)) < 0) {
					if (results2.size() == 100) {
						results2.remove(results2.size() - 1);
					}
					Lis[] l = new Lis[n + 1];
					System.arraycopy(res, 0, l, 0, n + 1);
					results2.add(l);
					Collections.sort(results2, (Lis[] l1, Lis[] l2) -> compareListings2(l1, l2));
				}
			}
			return;
		}
		if (index == 0) {
			for (Sys sys : sl) {
				if (!used.contains(sys.id)) {
					used.add(sys.id);
					for (Sta sta : sys.stations) {
						for (Lis lis : sta.listings) {
							if (lis.buy_price > 0 && lis.supply >= minSupDem) {
								res[index] = lis;
								if (sta.isPlanetary)
									getAlgo2(sl, results1, results2, res, true, index + 1, n, used);
								else
									getAlgo2(sl, results1, results2, res, planets, index + 1, n, used);
							}
						}
					}
					used.remove(sys.id);
				}
			}
		} else {
			Lis lis1 = res[index - 1];
			Sta sta1 = stations.get(lis1.station_id);
			Sys sys1 = systems.get(sta1.system_id);
			for (Sys sys : sl) {
				if (!used.contains(sys.id)) {
					used.add(sys.id);
					for (Sta sta : sys.stations) {
						Lis lis2 = sta.listingsMap.get(lis1.com_id);
						if (lis2 != null && lis1.buy_price > 0 && lis1.buy_price < lis2.sell_price
								&& lis1.supply >= minSupDem && lis2.demand >= minSupDem) {
							for (Lis lis : sta.listings) {
								if (lis.buy_price > 0 && lis.supply >= minSupDem) {
									res[index] = lis2;
									res[index + 1] = lis;
									if (sta.isPlanetary)
										getAlgo2(sl, results1, results2, res, true, index + 2, n, used);
									else
										getAlgo2(sl, results1, results2, res, planets, index + 2, n, used);
								}
							}
						}
					}
					used.remove(sys.id);
				}
			}
		}
	}

	//////////

	int compareListings2(Lis[] a, Lis[] b) {
		int sum1 = 0;
		for (int i = 0; i < a.length - 1; i += 2) { // length-1 ...
			sum1 += a[i + 1].sell_price - a[i].buy_price;
		}
		int sum2 = 0;
		for (int i = 0; i < b.length - 1; i += 2) {
			sum2 += b[i + 1].sell_price - b[i].buy_price;
		}
		return Integer.compare(sum1, sum2);
	}
 
K

kneitzel

Gast
Gibts das ganz auch in nicht-obfuskiert?

Das sollte wohl mehr ein Hinweis in Richtung Clean Code sein. Ich will da keine Punkte aufwärmen und Dich erst Recht nicht überzeugen ... Aber evtl. nimmst Du so ein Erlebnis als Anlass, da den einen oder anderen Punkt noch einmal zu überdenken.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich kann mit mrbrowns Kommentar nicht viel anfangen.
https://de.wikipedia.org/wiki/Obfuskation_(Software) hat gesagt.:
Obfuskation [...] beschreibt die absichtliche Veränderung von Programmcode, so dass der Quelltext für Menschen schwer verständlich [...] wird.

Dein Code ist der am schlechtesten verstehbare Code, den ich hier seit langem bei einer Frage gesehen habe. Das überrascht mich garnicht, dass da Fehler drin sind, und dass dir niemand helfen kann.
 
X

Xyz1

Gast
Mensch, ich habe es doch schon herausgefunden...
Sogar, wenn ich die Variablen abc... genannt hätte, hätte das mit der Fehlerfindung NICHTS zu tun gehabt... sprich, auch dann hätte man sehen können, dass etwas mit den Indices nicht stimmt.
 

Meniskusschaden

Top Contributor
sprich, auch dann hätte man sehen können, dass etwas mit den Indices nicht stimmt.
Ach wie oft hätte man sich schon freuen können, wie schön man es hätte, wenn man das, was man hätte sehen können, aber nicht gesehen hatte, weil man es nicht so deutlich geschrieben hatte, wie man es hätte schreiben können, so geschrieben hätte, dass man es nicht nur hätte sehen können, sondern gesehen hätte.
Hat man aber nicht.;)
 
K

kneitzel

Gast
Ja, selbstverständlich, die Namensgebung und so wird einfach überschätzt. Daher ist meine Empfehlung auch, sich gar nicht mit der Namenswahl auseinander zu setzen sondern statt dessen nur einen UUID Generator zu verwenden und da dann einfach einen _ davor zu setzen. Egal ob Klassen, Methoden oder Variablen ...

Das hat dann auch die gute Konsequenz, dass man sich mit diesen albernden Paketen nicht herumschlagen muss - alles kann in default package bleiben .....

*Sarkasmus aus*

Clean Code musst Du nicht ernst nehmen. Du kannst Deinen Code so schreiben, wie Du willst. Ich finde so harsche Abwertungen wie von mrBrown auch nicht wirklich zielführend, weshalb ich da auch nur etwas in diese Richtung Clean Code pushen wollte.... Wenn Du List und Zeit hast, dann kannst Du Dir sowas wie clean-code-developer.de ansehen. Aber Du kannst das auch gerne sein lassen. MIR ist das komplett egal.

Aber diese Konversation ist nicht wirklich zielführend, daher klinke ich mich hier auch gleich wieder aus.
 
X

Xyz1

Gast
@Meniskusschaden und @kneitzel Es war ein Versuch gewesen, ob jemand den Indices-Fehler gesehen hätte, noch bevor ich ihn sah. Natürlich gibt es immer bessere Variablennamen. Jetzt habe ich auch die harsche Kritik von mrbrown verstanden und denke, man hätte sie vielleicht auch etwas freundlicher schreiben können...
Den ersten Teil (if (index > n) {) könnte man in eine Methode auslagern. Den längeren zweiten Teil würd ich aber so lassen wie er ist.
Zu den Variablennamen habe ich schon etwas geschrieben. Dem einem reicht n, der andere möchte numbersOfArrayElementsToCreateAndAdd haben. Was sei jetzt besser?
 
K

kneitzel

Gast
Und l, l1, l2 in einem Kontext zu haben ist für Dich nicht unübersichtlich? Und was ist Lis? Und was ist Algo, das du mit deiner Funktion bekommen willst? Und es ist ein get, also könnte man meinen, dass es ein Getter ist und dann rechnet er ggf. länger wo es nicht erwartet wird?

Und nun schreib Unit Tests mit 100% Code coverage. Mag bei Dir gehen, aber du kannst dir vorstellen, dass es schwer verständlich sein kann: was muss man für welchen Fall außen übergeben damit ein bestimmter of Abzweig innen erreicht wird?

Das aber wieder nur als reine Anregung bzw Erläuterung meiner vorherigen Anregung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
M Fabrik Methode, gutes Beispiel? Allgemeine Java-Themen 0
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
N WaitForScript- methode in javafx Allgemeine Java-Themen 1
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
M Eine static-Methode verlassen Allgemeine Java-Themen 2
P "Overriden statische Methode" Statische Methode die vererbt wird Allgemeine Java-Themen 5
X Komponente an Methode übergeben Allgemeine Java-Themen 1
A Methode ergibt Java NullpointerException. Allgemeine Java-Themen 3
S Getestete Methode um das Beste aus URL-Nutzereingaben rauszuholen..? Allgemeine Java-Themen 4
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
M Methoden Methode Auslagern Allgemeine Java-Themen 6
P 4 Threads in einer Methode Allgemeine Java-Themen 2
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
N Methoden Methode Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben