Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter?

Skrodde

Aktives Mitglied
Hallo zusammen, ich betrachte folgende Methode:

Java:
/**
* @param terms - the terms to set
* @throws IllegalParameterException 
*/
public void setTerms(ArrayList<OptTerm> terms) throws IllegalParameterException {
	for (OptTerm term : terms){
		if (term.getExponent() != 1)
			throw new IllegalParameterException("Non-linear terms can not be set within a linear function.");
	}
this.terms = terms;
}

Wenn ich nun einen Term übergebe, dessen Exponent zwei ist, dann wird zwar die Exception geworfen, aber wenn ich danach auf
Java:
this.terms
zugreife, steht dennoch der Term mit dem Exponenten zwei darin. Ich dachte, der Methodenaufruf wird bei einem Throw komplett verlassen? Was stimmt hier nicht?
Vielen Dank für die Antwort, Gruß, Skrodde
 
Dann schreib hinter dem throw doch einfach:

Java:
return;

IMO kommt es darauf an wie du außerhalb das Exception-handling machst
 
Dann schreib hinter dem throw doch einfach:
Java:
return;
Wenn ich das mache meckert Eclipse: "Unreachable Code". Das soll ja auch so sein und ist ja auch gut so. Aber so ganz "unreachable" scheint mir die letzte Zeile meiner Methode nicht zu sein. :bahnhof:

IMO kommt es darauf an wie du außerhalb das Exception-handling machst
Da mache ich erst mal nicht, außerdem einem "System.out.println(exception.message);". Wie sollte auch das Verhalten außerhalb der Methode auf Werte eingehen, die in der Methode gesetzt werden? :autsch:
 
So ganz verstehe ich Deinen Code nicht.:bahnhof:

An die Methode übergibst Du eine Liste (übrigens wäre List<OptTerm> besser als ArrayList).

Du wirfst eine Exception wenn da ein Term drin steckt dessen Exponent > 1 ist.

Und Du wunderst Dich das in der Liste der Term drinbleibt?

Durch welche Aktion meinst Du denn wird das Element wieder aus der Liste genommen?
 
😳 Das mit dem return war natürlich blödsinn.

Aber das:

Java:
this.terms = terms;

wird nicht ausgeführt
 
ArrayList ist eine konkrete Implementierung des List-Interface

Wenn man List übergeben würde, dann könnte man jede beliebige Implementierung verwenden.
Z.B.: Linked List
 
Hallo ihr beiden,
ihr habt beide recht. Turtle, mit deinem Kommentar bin ich darauf gekommen, dass das was ich machen WOLLTE nicht ist, was ich TUE. Ich wollte auf zwei Listen arbeiten: Eine die übergeben wird und dann eine lokale Kopie dieser Liste. Außerhalb habe ich in meinem Test halt nur eine Liste, die ich modifiziere und mit der ich jeweils die Methode aufrufe. Beim ersten Aufruf (der erfolgreich laufen soll) habe ich aber mit
Java:
this.terms = terms;
natürlich keine Kopie des Objekts erstellt, sondern nur die Instanz übernommen. Wenn ich diese Instanz dann außerhalb der Methode ändere und die Methode wiederum mit dieser Instanz aufrufe, dann hat Flown völlig recht, die letzte Zeile wird nicht ausgeführt, aber muss sie ja auch nicht, weil ich ja die Instanz verändert habe.
Ich habe obige Zeile jetzt zu
Java:
this.terms.clear();
this.terms.addAll(terms);
geändert und damit funktioniert alles wunderbar. Und ich werde den Ausdruck von ArrayList auf List ändern, vielen Dank für die Anregung.

Danke an euch beide für die schnelle Hilfe, Gruß, Skrodde :toll:
 
[OT]

Da ich selbst gerne eine ArrayList verwende:
Warum ist die Liste besser als eine ArrayList ?[/OT]

generell gesagt, man sollte immer gegen die Schnittstellen implementieren und gegen keine Implementierungen - es geht darum sein Programm flexibel zu halten und sich nicht direkt an andere binden
 

Zurück
Oben