Exceptions

schiese

Erfahrenes Mitglied
Hallo,
habe hier im Skript eine Aufgabe, zu der ich eine Frage habe:

"Schreiben Sie eine Methode, mit der sie ganze, gerade Zahlen halbieren können. Die Methode muss eine Exception werfen, falls eine ungerade Zahl übergeben wird. Verwenden Sie dazu eine angemessene Exception-Klasse."

Mir ist das mit den Fehlermeldungen noch nicht ganz klar. Ich soll ja nicht so etwas wie folgt machen
Java:
import java.util.*;
public class Teiler {
	
	public static void geradeZahlTeilen(int zahl) {
		int wert = 6;
		
		if ((wert % 2) > 0) {
			System.out.println("Bitte eine gerade Zahl eingeben.");
		} else {
			System.out.println("Das Ergebnis ist: "+(wert/2));
		}
	}
	
	public static void main(String[] args) {
		
		geradeZahlTeilen(10);
       }
}
Sondern eine try-catch-Anweisung. Wo kann denn in dem Code eine Exception auftreten?
Welche Exception kann ich denn nehmen? NumberFormatException geht ja nicht, da das Format ja auf jeden Fall richtig ist.

Gruß
schiese
 
Eine Exception werfen kannst du mit "throw", diese wird dann(falls kein try-catch-Block vorhanden) an die übergeordnete Funktion weitergegeben.
Logisch gesehen würde ich in deinem Fall eine IllegalArgumentException nehmen, da in dem Fall der Parameter(Argument) nicht den richtigen Wert hat, also so:
Java:
import java.util.*;
import java.lang.*;
public class Teiler {
	
	public static void geradeZahlTeilen(int zahl) {
		int wert = 6;
		
		if ((wert % 2) > 0) {
			throw new IllegalArgumentException("wert ist ungerade");
		} else {
			System.out.println("Das Ergebnis ist: "+(wert/2));
		}
	}
	
	public static void main(String[] args) {
		
		geradeZahlTeilen(10);
       }
}
 
Java:
import java.util.*;
import java.lang.*;
public class Teiler {
	
	public static void geradeZahlTeilen(int zahl) {
		int wert = 6;
		
		if ((wert % 2) > 0) {
			throw new IllegalArgumentException("wert ist ungerade");
		} else {
			System.out.println("Das Ergebnis ist: "+(wert/2));
		}
	}
	
	public static void main(String[] args) {
		
		geradeZahlTeilen(10);
       }
}
Vorsicht!
Das Programm funktioniert für negative ungerade Zahlen nicht! Liegt daran, daß unter Java der Ausdruck wert % 2 negativ wird, wenn "wert" negativ ist. Probiers aus:
Java:
public static void main(String[] args) {
	geradeZahlTeilen(-11);
}
ergibt als Ausgabe "Das Ergebnis ist -5"

Thinker
 
Vielen Dank, Matt297.
Jetzt habe ich gerade gefunden, dass man auch
Java:
public static void geradeZahlTeilen(int zahl) throws IllegalArgumentException {
.....
}
schreiben kann. Da war leider keine Erklärung zu. Heißt es, dass die Methode eine Exception werfen kann?

@Thinker: hast Recht. Habe es so geändert:
Java:
if ((wert % 2) != 0) {
...
}

schiese
 
Vielen Dank, Matt297.
Jetzt habe ich gerade gefunden, dass man auch
Java:
public static void geradeZahlTeilen(int zahl) throws IllegalArgumentException {
.....
}
schreiben kann. Da war leider keine Erklärung zu. Heißt es, dass die Methode eine Exception werfen kann?
"throws Exception heisst nur, daß die Exception geworfen werden _kann_, nicht das sie geworfen werden muß. Das dient sozusagen als Markierung, damit der Programmierer,der die Methode aufruft weiß, was er behandeln sollte. Wirklich werfen kannst du sie nur mit "throw new MyFavoriteException()".
(Alle "Checked Exceptions" muß man auf diese Weise deklarieren, wenn man sie werfen will. Google bringt da bestimmt noch bessere Erklärungen)

V
@Thinker: hast Recht. Habe es so geändert:
Java:
if ((wert % 2) != 0) {
...
}
Jepp, so ists besser.
 
Ich habe jetzt eine neue Frage.
Der zweite Teil der Aufgabe lautet:
"Testen Sie ihre Methode und die Exception mit einem Rahmenprogramm, das die zu teilende Zahl zeilenweise solange per Tastatureingabe entgegennimmt, bis das Programm mit der Eingabe 'q' beendet wird. Vorher soll das Programm nicht abgebrochen werden können. Berücksichtigen Sie dazu alle auftretenden
Exceptions."

Mein Programm funktioniert soweit auch. Die Frage ist nur, ob das so eine gute Lösung ist, oder löst man das Problem anders, vllt. effizienter?

Java:
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class Serie2_Aufgabe4 {
	
	public static void geradeZahlTeilen(int zahl) throws IllegalArgumentException {

		if ((zahl % 2) != 0) {
			throw new IllegalArgumentException("Die Zahl ist ungerade");
		} else {
			System.out.println("Das Ergebnis ist: "+(zahl/2));
		}
	}
	
	public static void main(String[] args) throws IOException {
		String wert;
		InputStream lesen = System.in;
		InputStreamReader zilesen = new InputStreamReader(lesen);
		BufferedReader zelesen = new BufferedReader(zilesen);

		do {
			System.out.println("Bitte eine Zahl eingeben.");
			wert = zelesen.readLine();
			
			try {
			geradeZahlTeilen(Integer.valueOf(wert));
			} catch (NumberFormatException e) {
				System.out.println("Bitte keine Buchstaben.");
			} catch (IllegalArgumentException e) {
				System.out.println("Bitte eine gerade Zahl eingeben.");
			}
		} while (!String.valueOf(wert).equals("q"));	
	}
}

Gruß schiese
 

Neue Beiträge

Zurück