Fehlerbehandlung

Status
Nicht offen für weitere Antworten.

stormtide

Mitglied
Hallo...
Ich habe wieder mal ein Problem.
Wir haben eine Aufgabe gestellt bekommen, in der wir folgende Formel berechnen sollten:

Resultat der Berechnung = (Wurzel aus A) / B

Eigentlich keine schwierige Sache.
Aber wir haben ein paar Bedingungen:
Für die Eingabe der Zahlen sowie die Berechnung muss immer eine Funktion aufgerufen werden.
Weiter sollten Exceptions abgefangen werden
(in diesem Programm vorallen die Eingabe von Buchstaben, da Double ja nur Fliesskommazahlen akzeptiert.

Das Programm ist schon fertig geschrieben, bevor ich programmierte war ich sicher das mein Ansatz funktioniert.
Aber er funktioniert nicht.
Ich bekomme bei der Ausführung des Tools meine Ausgabeline: "Ihr Ergebnis lautet: NaN".

Kann mir jemand helfen?

Liebe Grüsse, Andy

Code:
*******************************************************************************
* Programm: Fehler
* Autor: André Rohrbach
* Datum: 10. Dezember 2004
* Version: 0.9
* File: fehler.java
* Beschreibung
*	Das Programm führt die Berechung der in der Aufgabenstellung notierten
*	Formel durch. Dabei wird für die Eingabe jedes Wertes und auch für die
*	Berechung eine eigene Fuktion verwendet. Das Programm darf auf keinen Fall
*	abstürzen.
* Aufgabenstellung:
*	Aufgaben Fehlerbehandlung; Aufgabe 1
*******************************************************************************/
 
import java.io.*;

public class fehler {
	
	/***************************************************************************
	* Die nachfolgenden Zeilen machen die Eingabe von Zahlen durch den Benutzer
	* möglich. Unterstützt werden Variablen des Datentyps Double.
	***************************************************************************/
	
	static BufferedReader 		din;
	static void OpenInput()
	{
		din = new BufferedReader(new InputStreamReader(System.in));
	}
	static double	ReadDouble()
	{
		double		a=0.0;
		
		
		try {
			a = Double.parseDouble(din.readLine());
		} catch (IOException e1) { 
			System.out.print ("Ungueltige Eingabe!!\n");
			System.exit (-1);
		} catch (NumberFormatException e2){ 
			System.out.print ("Ungueltige Eingabe!!\n");
			System.exit (-1);
		}
		
		return (a);
	}
	
	/***************************************************************************
	* Die Funktion nimmt den Wert für die Variable a auf, überprüft auf eine
	* korrekte Eingabe. Ist die Eingabe ungültig, wiederholt es diese, bis eine
	* brauchbare Zahl eingegeben wird.
	***************************************************************************/
	
	static double Eingabe_a () {
		
		// Datentypdefinition
		double a=0;				// Nimmt die Zahl auf
		boolean test=false;		// Testet ob eine gültige Zahl eingegeben wurde
		
		while (test=false) {
			
			// Versuchen die Zahl einzulesen
			try {
				System.out.println ("Geben Sie den Wert A ein: ");
				a=ReadDouble();
				test=true;
			}
			
			// Wenn ungültige Zahl, folgende Befehle ausführen
			catch (Exception e) {
				System.out.println ("Ungültige Zeichenfolge eingegeben.");
			}
		}
		
		// a an Hauptprogramm übergeben
		return(a);
	}
	
	/***************************************************************************
	* Die Funktion nimmt den Wert für die Variable b auf, überprüft auf eine
	* korrekte Eingabe. Ist die Eingabe ungültig, wiederholt es diese, bis eine
	* brauchbare Zahl eingegeben wird.
	***************************************************************************/
	
	static double Eingabe_b () {
		
		// Datentypdefinition
		double b=0;				// Nimmt die Zahl auf
		boolean test=false;		// Testet ob eine gültige Zahl eingegeben wurde
		
		while (test=false) {
			
			// Versuchen die Zahl einzulesen
			try {
				System.out.println ("Geben Sie den Wert B ein: ");
				b=ReadDouble();
				test=true;
			}
			
			// Wenn ungültige Zahl, folgende Befehle ausführen
			catch (Exception e) {
				System.out.println ("Ungültige Zeichenfolge eingegeben.");
			}
		}
		
		// a an Hauptprogramm übergeben
		return(b);
	}
	
	/***************************************************************************
	* Diese Funktion berechnet das Ergebnis aus den beiden Variabeln a und b.
	***************************************************************************/
	
	static double Berechnung (	double a,	// Wert a
								double b)	// Wert b 
	{	
		// Datentypdefinition
		double temp=0;		// Variable zur Zwischenspeicherung von Wurzel(a)
		double result=0;	// Speichert das Resultat der Berechung
		
		// Berechung
		temp=Math.sqrt(a);
		result=temp/b;
		
		// Resultat an Hauptprogramm übergeben
		return(result);
	}
	
	/***************************************************************************
	* Das Programm berechnet die in der Aufgabenstellung gestellte Formel
	* durch den Aufruf der jeweiligen Funktionen.
	**************************************************************************/
	 
	public static void main(String[] args) {
	 	
	 	// Definition der Datentypen
	 	double a=0;			// Speichert den Wert a
	 	double b=0;			// Speichert den Wert b
	 	double result=0;	// Speichert das Resultat
	 	
		// Aufrufen der Funktionen
		a=Eingabe_a();
		b=Eingabe_b();
		result=Berechnung(a,b);
		
		// Ausgabe des Resulatates
		System.out.println ("Ihr Ergebnis lautet: "+result);
	}
}
 

foobar

Top Contributor
Code:
while (test=false) {
Du machst hier eine Zuweisung, anstatt eine Überprüfung durchzuführen.

So sollte das aussehen:
Code:
while ( test == false ) {
 

foobar

Top Contributor
- Klassennamen beginnen immer mit einem Großbuchstaben
- Methodennamen beginnen immer mit einem Kleinbuchstaben
- Unterstriche in Methodennamen sind nicht sehr schön (verwende immer Camelcase)
- Warum sind alle deine Methoden static?
- Wenn du überprüfen willst ob eine Eingabe gültig war, dann fang eine NumberformatException und nicht Exception.
 

stormtide

Mitglied
Ich weiss, einige Schönheitsfehler sind drin, leider sind das die Vorgaben unseres beknackten Lehrers... :oops:
Hm, ich habe test == false gesetzt, aber leider bekomme ich nun eine Endlosschleife, ich kann den Wert gar nicht eingeben... :?
 

Bleiglanz

Gesperrter Benutzer
foobar hat gesagt.:
Code:
while (test=false) {
Du machst hier eine Zuweisung, anstatt eine Überprüfung durchzuführen.

So sollte das aussehen:
Code:
while ( test == false ) {
um diesen Fehler zu vermeiden, schreibe IMMER
Code:
false==test
also wenns einen konstanten Wert gibt, immer const==var; denn wenn man ein = vergisst, wird andersrum leicht aus einem var==const ein var=const

alte C-Programmierer Weisheit
 

foobar

Top Contributor
@Bleiglanz Danke für den Tip.
Ich hab mich immer gewundert, weshalb man so oft false == myvar liest.
 

foobar

Top Contributor
Ich hab mal einwenig aufgeräumt:
Code:
import java.io.*;

public class ComputeSqrt
{

	/***************************************************************************
	* Die nachfolgenden Zeilen machen die Eingabe von Zahlen durch den Benutzer
	* möglich. Unterstützt werden Variablen des Datentyps Double.
	***************************************************************************/

	private BufferedReader din;
	public ComputeSqrt()
	{
		this.openInput();
	}
	
	public void openInput()
	{
		din = new BufferedReader(new InputStreamReader(System.in));
	}
	
	public double readDouble() throws NumberFormatException, IOException
	{
		return Double.parseDouble(din.readLine());
	}

	/***************************************************************************
	* Die Funktion nimmt den Wert für die Variable a auf, überprüft auf eine
	* korrekte Eingabe. Ist die Eingabe ungültig, wiederholt es diese, bis eine
	* brauchbare Zahl eingegeben wird.
	***************************************************************************/

	public double getInput(String message)
	{
		// Datentypdefinition
		double a = 0; // Nimmt die Zahl auf
		while (true)
		{
			// Versuchen die Zahl einzulesen
			System.out.println( message );
			try
			{
				a = readDouble();
				break;
			}
			catch (NumberFormatException e)
			{
				System.out.println("Bitte geben sie einen gültigen Wert ein");
			}
			catch (IOException e)
			{
				e.printStackTrace();
				System.exit(0);
			}
		}
		// a an Hauptprogramm übergeben
		return (a);
	}

	/***************************************************************************
	* Diese Funktion berechnet das Ergebnis aus den beiden Variabeln a und b.
	***************************************************************************/

	public double compute(double a, double b)
	{
		// Datentypdefinition
		double temp = 0; // Variable zur Zwischenspeicherung von Wurzel(a)
		double result = 0; // Speichert das Resultat der Berechung

		// Berechung
		temp = Math.sqrt(a);
		result = temp / b;

		// Resultat an Hauptprogramm übergeben
		return (result);
	}

	/***************************************************************************
	* Das Programm berechnet die in der Aufgabenstellung gestellte Formel
	* durch den Aufruf der jeweiligen Funktionen.
	**************************************************************************/

	public static void main(String[] args)
	{
		ComputeSqrt c = new ComputeSqrt();
		
		// Aufrufen der Funktionen
		double a = c.getInput("Bitte geben sie einen Wert für A ein");
		double b = c.getInput("Bitte geben sie einen Wert für B ein");
		double result = c.compute(a, b);

		// Ausgabe des Resulatates
		System.out.println("Ihr Ergebnis lautet: " + result);
	}

}
 

stormtide

Mitglied
Immer das gleiche Problem (ich meine es nicht böse):
Ein Code wird gepostet, der basierend auf meinem Ansatz lauffähig ist.
Das Problem: Mein Lehrer wird das nicht akzeptieren.
Begründung: Befehle und Funktionen enthalten, die wir im Unterricht nicht behandelt haben... :?
 

stormtide

Mitglied
Gibt es keine einfache Lösung des Problems, bei der nur ein paar Zeilen meines Codes geändert werden müssen?

Das Problem liegt bei den Zeilen 65 und 96, aus irgendeinem Grund überspringt es die Benutzereingabe. Hat jemand eine Idee warum?
 

stormtide

Mitglied
Sorry, war ein dummer Fehler von mir...
Ich habe vergessen die Eingabe mittels
Code:
OpenInput();
zu eröffnen...
Vielen Dank für eure Hilfe!
 

stormtide

Mitglied
Hallo...
Dies ist mein aktueller Code, der das Programm unendlich mal ausführt. Funktioniert alles so wie es sollte, auch der Aufruf einer erneuten Eingabe, wenn für a Beipielsweise Zeichen eingegeben wurden. Jetzt sollte der Benutzer das Programm noch beenden können, indem er für die Variable a "bye" eingibt. Weiss jemand wie das geht?

Code:
/*******************************************************************************
* Programm: Fehler
* Autor: André Rohrbach
* Datum: 15. Dezember 2004
* Version: 0.99
* File: fehler.java
* Beschreibung
*	Das Programm führt die Berechung der in der Aufgabenstellung notierten
*	Formel durch. Dabei wird für die Eingabe jedes Wertes und auch für die
*	Berechung eine eigene Fuktion verwendet. Das Programm darf auf keinen Fall
*	abstürzen.
* Aufgabenstellung:
*	Aufgaben Fehlerbehandlung; Aufgabe 1
*******************************************************************************/
 
import java.io.*;

public class fehler {
	
	/***************************************************************************
	* Die nachfolgenden Zeilen machen die Eingabe von Zahlen durch den Benutzer
	* möglich. Unterstützt werden Variablen des Datentyps Double.
	***************************************************************************/
	
	static BufferedReader 		din;
	static void OpenInput()
	{
		din = new BufferedReader(new InputStreamReader(System.in));
	}

	/***************************************************************************
	* Die Funktion nimmt den Wert für die Variable a auf, überprüft auf eine
	* korrekte Eingabe. Ist die Eingabe ungültig, wiederholt es diese, bis eine
	* brauchbare Zahl eingegeben wird.
	***************************************************************************/
	
	static double Eingabe_a () {
		
		// Datentypdefinition
		double a=0;				// Nimmt die Zahl auf
		boolean test=false;		// Testet ob eine gültige Zahl eingegeben wurde
		
		while (test==false) {
			
			// Versuchen die Zahl einzulesen
			try {
				System.out.print ("Geben Sie den Wert A ein: ");
				a = Double.parseDouble(din.readLine());
				test=true;
			}
			
			// Wenn ungültige Zahl, folgende Befehle ausführen
			catch (IOException e1) {
				System.out.println ("Ungueltige Zeichenfolge eingegeben.");
			}
			
			catch (NumberFormatException e2) {
				System.out.println ("Ungueltige Zeichenfolge eingegeben.");
			}
		}
		
		// a an Hauptprogramm übergeben
		return(a);
	}
	
	/***************************************************************************
	* Die Funktion nimmt den Wert für die Variable b auf, überprüft auf eine
	* korrekte Eingabe. Ist die Eingabe ungültig, wiederholt es diese, bis eine
	* brauchbare Zahl eingegeben wird.
	***************************************************************************/
	
	static double Eingabe_b () {
		
		// Datentypdefinition
		double b=0;				// Nimmt die Zahl auf
		boolean test=false;		// Testet ob eine gültige Zahl eingegeben wurde
		
		while (test==false) {
			
			// Versuchen die Zahl einzulesen
			try {
				System.out.print ("Geben Sie den Wert B ein: ");
				b = Double.parseDouble(din.readLine());
				test=true;
			}
			
			// Wenn ungültige Zahl, folgende Befehle ausführen
			catch (IOException e1) {
				System.out.println ("Ungueltige Zeichenfolge eingegeben.");
			}
			
			catch (NumberFormatException e2) {
				System.out.println ("Ungueltige Zeichenfolge eingegeben.");
			}
		}
		
		// a an Hauptprogramm übergeben
		return(b);
	}
	
	/***************************************************************************
	* Diese Funktion berechnet das Ergebnis aus den beiden Variabeln a und b.
	***************************************************************************/
	
	static double Berechnung (	double a,	// Wert a
								double b)	// Wert b 
	{	
		// Datentypdefinition
		double temp=0;		// Variable zur Zwischenspeicherung von Wurzel(a)
		double result=0;	// Speichert das Resultat der Berechung
		
		// Berechung
		temp=Math.sqrt(a);
		result=temp/b;
		
		// Resultat an Hauptprogramm übergeben
		return(result);
	}
	
	/***************************************************************************
	* Das Programm berechnet die in der Aufgabenstellung gestellte Formel
	* durch den Aufruf der jeweiligen Funktionen.
	**************************************************************************/
	 
	public static void main(String[] args) {
	 	
	 	// Definition der Datentypen
	 	double a=0;			// Speichert den Wert a
	 	double b=0;			// Speichert den Wert b
	 	double result=0;	// Speichert das Resultat
	 	boolean schleife=true;
	 	
		// Eröffnen der Eingabe
		OpenInput();
		
		
		while (schleife) { 
			
			// Aufrufen der Funktionen
			a=Eingabe_a();
			b=Eingabe_b();
			result=Berechnung(a,b);
		
			// Ausgabe des Resultates
			System.out.println ();
			System.out.println ("Ihre Zahl A lautet: "+a);
			System.out.println ("Ihre Zahl B lautet: "+b);
			System.out.println ("Ihr Ergebnis lautet: "+result);
			System.out.println ();
			System.out.println ("------------------");
			System.out.println ();
		}
	}
}
 

foobar

Top Contributor
Code:
   static double Eingabe_a () {
      
      // Datentypdefinition
      double a=0;            // Nimmt die Zahl auf
      boolean test=false;      // Testet ob eine gültige Zahl eingegeben wurde
      
      while (test==false) {
         
         // Versuchen die Zahl einzulesen
         try {
            System.out.print ("Geben Sie den Wert A ein: ");
           String line = din.readLine();
           if (line != null && line.equals("bye"))
           {
                 System.out.println("exit");
                 System.exit( 0 );
             }
            a = Double.parseDouble( line );
            test=true;
         }
         
         // Wenn ungültige Zahl, folgende Befehle ausführen
         catch (IOException e1) {
            System.out.println ("Ungueltige Zeichenfolge eingegeben.");
         }
         
         catch (NumberFormatException e2) {
            System.out.println ("Ungueltige Zeichenfolge eingegeben.");
         }
      }
      
      // a an Hauptprogramm übergeben
      return(a);
   }
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben