Java Standard: Lösungen Assertations

Aus Wikibooks

Lösungen zu den Übungen: Assertion[Bearbeiten]

Diese Seite enthält die Lösungen zu den Übungen zur Java-Anweisung assert. Das zugehörige Kapitel finden Sie hier.

1: Ein switch()-Test[Bearbeiten]

1.1: Die assert-Anweisung wertet den auf sie folgenden Ausdruck aus und löst sie nach true oder false auf. Diese Auflösung ist in diesem Fall nicht nötig: weil als Testergebnis gleich ein false gesetzt wurde wird das Programm immer dann abgebrochen, wenn die default-Option der switch-Anweisung erreicht wird.

1.2: Da keine Anweisung gegeben wurde, einen eigenen Text auszugeben, wird dem Programmierer beim Abbruch die Standard-Fehlermeldung bei assert-Anweisungen angezeigt. Um eine eigene Fehlermeldung zu erzeugen könnte man zum Beispiel das Folgende schreiben:

assert false : "Abbruch in der switch()-Anweisung wegen eines fehlerhaften Ergebnisses (nicht JA oder NEIN)";

2: Do it yourself[Bearbeiten]

2.1: Der Code könnte etwa folgendermaßen aussehen:

public int diceTest() {
	private int summe = 0;
	private int result = 0;

	for(int n = 0; n< 100; n++) {
		result = dice():
		assert result >= 1 : "Würfelwurf kleiner als 1 registriert";
		assert result <= 6 : "Würfelwurf größer als 6 registriert";
		summe += result;
	}

	return summe;
}

2.2: Es wird der Test auf "Resultat >= 1" fehlschlagen, also der erste assert-Test ausgelöst. Der Grund ist die fehlerhafte Programmierung der Funktion dice() aus der Aufgabe: sie liefert nicht, wie behauptet, die Werte 1 bis 6 zurück, sondern 0 bis 5. Grund dafür ist die Funktion Math.random(). Sie liefert einen Wert zwischen 0 und 1 zurück. Durch den Cast des gelieferten double-Wertes von Math.random() zu einem (int)-Wert werden die Nachkommastellen abgeschnitten. In einem von sechs Fällen wird ein Wert unter ⅙ zurückgeliefert, so dass durch die fehlende Rundung beim Cast der Wert 0 zurückgeliefert wird.

Eine sauber programmierte Funktion dice() könnte also folgendermaßen aussehen:

public int dice() {
	return Math.min((int)(Math.random()*6)+1, 6);
}