Java: Hilfe bei Exception

M

MATT2k

Gast
Java: Hilfe bei Exception - geholfen

Hi,

ich habe gerade ein Tastatureingabe mit dem Scanner gebastelt:

Code:
static Scanner sc = new Scanner(System.in);
	
	static double readDouble(String t) throws NegativeNumberException {
		double eingabe;
		System.out.println(t);
		String s = sc.next(); 
		return eingabe = Double.parseDouble(s);
	
	}

Ich möchte hier noch überprüfen, ob die Eingabe ein positive oder negativer Wert ist und dann bei einem Negativen die Exception auslösen lassen.
Aber irgendwie stehe ich hier auf dem Schlauch.
Hätte da jemand nen Tipp für mich?

Gruß,
Matthias

// edit:

Also ich hätte schonmal sowas:
Code:
static double readDouble(String t) throws NegativeNumberException {
		double eingabe;
		System.out.println(t);
		String s = sc.next(); 
		eingabe = Double.parseDouble(s);
		
		try{
			if (eingabe < 0)
				throw new NegativeNumberException();
			else return eingabe;
		}
		catch (NegativeNumberException e){
			
		}
Aber so richtig hilft mir das auch nicht weiter.
 
Zuletzt bearbeitet von einem Moderator:
Muss es unbedingt eine Exception sein? Du willst sie ja eh gleich wieder catchen oder?
Hier ml eine recht simple Lösung ;)

Code:
import java.util.Scanner;

public class NegativeException {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.print("Bitte um Eingabe: ");
		double wert = Double.parseDouble(scan.next());
		if (wert < 0) {
			System.err.println("Negative Zahl!");
		} else {
			System.out.println(wert);
		}
	}
}
 
Es geht mir darum etwas mit den Exceptions zu üben. Da bringt mir die einfache Variante nicht sehr viel ;)
 
was hilft dir denn an deiner Lösung nicht weiter? was willst du genau machen?

Code:
throw new NegativeNumberException();

schmeißt dir ja deine neue Exception ...
 
Zuletzt bearbeitet:
Hey,

Im Moment verstehe ich aber nicht wo dein Problem ist. Der zweite Quelltext sieht doch schon ganz gut aus. Du musst allerdings noch die Klasse NegativeNumberException erstellen falls du das noch nicht getan hast, weil die gehört meines wissens nach nicht zur Standard-Runtime.

Aber wäre gut wenn du nochmal genau sagen würdest wo deine Verständnisprobleme liegen.
 
Zuletzt bearbeitet:
Also die Klasse der Exception habe ich auch geschrieben.

Wenn ich die Methode so schreibe, wie ich es oben gemacht habe, dann bekomme ich immer den Fehler "This method must return a result of type double".
Ich kann also dort keine Fehlermeldung ausgeben!

Ich würde es gerne so haben, dass halt ne Fehlermeldung kommt und dann nochmal die Eingabeaufforderung (bis der Wert nicht mehr <0 ist)
 
Ahh, okay das Problem ist das deine Methode nicht immer einen Wert zurück gibt.
Wenn du im Methodenkopf einen Rückgabewert angibst muss die Methode auch auf jeden Fall einen Wert zurückgeben. In deinem Fall gibt die Methode aber nur einen Wert zurück wenn alles richtig funktioniert.

Das mit der wiederholten Eingabenaufforderung kannst du so machen, dass du im Fehlerfall z.B. -1 zurückgibts und um den Aufruf der Methode ein while machst
 
Joker86 schrieb:
Das mit der wiederholten Eingabenaufforderung kannst du so machen, dass du im Fehlerfall z.B. -1 zurückgibts und um den Aufruf der Methode ein while machst

Meinst du ein While Schleife außerhalb der Methode oder innerhalb erstellen?
 
Ich würd's außerhalb der Methode machen.
Wie DaBigTank schon gesagt hat in den catch-Block ein return -1 und um den Aufruf der Methode dann eine while Schleife.
 
Dann muss ich das aber immer in der ausführbaren Datei machen.
Wenn ich die Eingabe Methode weiter verwenden will ist das ein bisschen unpraktisch.

ich hätte noch was neues, aber klappt nicht so ganz
Code:
static double readDouble(String t) throws NegativeNumberException {
		
		double eingabe = 0.0;
		boolean fehler = true;
		while (fehler)
		try {
			System.out.println(t);
			String s = sc.next(); 
			eingabe = Double.parseDouble(s);	
			fehler = false;
		}
		catch (NegativeNumberException e){
			System.out.println("Fehler");
		}
		return eingabe;
	}
da sagt er, dass die Catch Klausel unerreichtbar ist.
 
im try kann ja auch keine auftreten ... ist die NegativeNumberFormatException überhaupt standart?
 
Code:
throw new NegativeNumberException();

ausführen wenn eine negative Zahl eingegeben wurde ...
 
Mach doch die while außerhalb und dann mach es einfach ungefähr so:

Code:
while(readDouble(t) < 0)

dann musst aber au in dem catch-Block das return -1 machen
 
Naja du musst dir ja die frage stellen ob du immer wenn du diese Methode aufrufst genau diese Funktionalität haben willst (Schleife bis Eingabe korrekt). Wenn das der Fall ist macht es natürlich sinn die Schleife in der Methode zu machen.

Das mit der Exception hattest du am Anfang doch schon richtig

Code:
if (eingabe < 0) {
throw new NegativeNumberException();
}
 
Zuletzt bearbeitet:
Ja, hab ich auch gerade gesehen.
Es klappt, wenn ich das hier habe:
Code:
static double readDouble(String t) throws NegativeNumberException {
		
		double eingabe = 0.0;
		boolean fehler = true;
		while (fehler)
		try {
			System.out.println(t);
			String s = sc.next(); 
			eingabe = Double.parseDouble(s);
			if (eingabe < 0) throw new NegativeNumberException();
			fehler = false;
		}
		catch (NegativeNumberException e){
			System.out.println("Fehler");
		}
		return eingabe;
	}
 
Das macht doch nur begrenzten Sinn, dass eine Methode, welche eine Exception wirft, diese Exception auch selbst abfängt ...
Weil für dein Beispiel brauchst du keine Exceptions, der große Nutzen von Exceptions ist, dass man Fehler eben aus Methoden heraus übergeben kann, nicht dass eine Methode, welche eine Exception abwirft, diese auch selbst behandelt - dafür braucht man offensichtlich keine Exceptions, zumindest nicht zwingend.

Wenn dann sollte es so sein:
Code:
static double readDouble(String t) throws NegativeNumberException {
		
		double eingabe = 0.0;
		System.out.println(t);
		String s = sc.next(); 
		eingabe = Double.parseDouble(s);
		if (eingabe < 0) throw new NegativeNumberException();
		return eingabe;
	}

Dort, wo die Methode readDouble aufgerufen wird, muss es dann etwa so aussehen:
Code:
static void Aufrufmethode()
{
		try {
			double Eingabe = readDouble("Bitte geben Sie eine positive Zahl ein: ");
		}
		catch (NegativeNumberException e){
			System.out.println("Sie haben eine negative Zahl eingegeben");
		}
}

Edit:
Exceptions sollen Code einfacher machen, dein Code wäre ohne Exceptions aber deutlich einfacher:
Code:
static double readDouble(String t) throws NegativeNumberException {
		
		double eingabe = 0.0;
		while (true) {
			System.out.println(t);
			String s = sc.next(); 
			eingabe = Double.parseDouble(s);
			if (eingabe >= 0) return eingabe;
		}
		return eingabe; // wird eh nie aufgerufen
	}
 
Zuletzt bearbeitet:
Ja, das sieht doch gut aus.
Wenn du's hübsch haben willst solltest du vielleicht noch ein wenig in der Methode aufräumen. Damit meine ich das throw im Methodenkopf und den Stringparameter der Methode, du verwendest den String doch praktisch nicht.

Und wenn du's ganz hübsch haben willst kannst du ja jetzt noch Fehleingaben(Buchstaben statt Zahlen eingeben) abfangen.

@1668mib
Ich geb dir Recht, dass es in diesem Fall auch ohne Exceptions gehen würde, aber er hat ja anfangs gesagt, dass es ihm um den Lerneffekt geht. Dein unteres Beispiel würde glaube ich nicht compiliert werden wegen Code unreachable.
 
Zuletzt bearbeitet:
Am schönsten is es aber wenn du es so machst, wie 1668mib es gezeigt hat.
Das ganze kannst ja dann in die von dir gewünschte while-schleife packen.

@Joker86
warum sollte der Code unreachable sein?
...ah ok, sry seh grad....jo das untere gäbe ein fehler wegen dem return ;)
 
Zuletzt bearbeitet:
Zurück
Oben