Fehlermeldung bei falscher Berechnung anzeigen

  • Themenstarter Themenstarter Lolatch
  • Beginndatum Beginndatum
L

Lolatch

Gast
Hallo

Seit einige Woche befasse ich mit Java und hab da eine Rechnung geschrieben. Das Resultat soll kein NULL oder eine negative Zahl sein. Bitte Helfen 🙁, bin seit zwei Stunden dran

Java:
// Importiert Java Bibliothek
 import java.io.*;
 
//Importiert DecimalFunktion
import java.text.DecimalFormat;

// Eigene Exception erstellen
	class ungueltig_zahl extends Exception{
		public ungueltig_zahl () {}
		public ungueltig_zahl (String meldung){
				super (meldung);
		}
}


// Eigene Klasse 
public class rechner_v2 
{
	static float ungueltig(double a, double b, double c) throws ungueltig_zahl{
		double res;
		res = Math.sqrt(a-b) / c;
		
		// Wenn das Resultat 0 ist
		if (res == 0){
			throw new ungueltig_zahl(""+res);
		}
		// Wenn das Resultat kleiner als Null ist sprich negativ
		if(res > 0){
			throw new ungueltig_zahl(""+res);
		}
		// gibt den Wert zurueck
		return res;
	}
	
	public static void main(String[] args) throws Exception
   	{
		
		// Variable deklarieren
   		double a, b, c, res;
		String aString = "";
		// Beenden des Programmes 
		String ende = "bye";
		// eröffnet das Eingabefld "Einagbe"
		BufferedReader Eingabe = new BufferedReader (new InputStreamReader(System.in));
		
		do{
			System.out.println("Geben Sie drei Zahlen ein");
			// Der User wird aufgefordet die erste Zahl einzugeben
			System.out.print("z1: ");
			// Speichert in Variable a
			a = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die zweite Zahl einzugeben
			System.out.print("z2: ");
			// Speichert in Variable b
			b = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die dritte Zahl einzugeben
			System.out.print("z3: ");
			// Speichert in Variable c
			c = Float.parseFloat(Eingabe.readLine());
			// Die Rechnung wird in Variable res gespeichert
			res = Math.sqrt(a-b) / c;
			
			// Runden auf 2 Kommastellen
			DecimalFormat round = new DecimalFormat("0.00");
			String rund = round.format(res);
			
			try{
					res = calc(f1, f2, op);
			}
			catch(ungueltig_zahl e){
				System.out.println(">> "+e);

			}
			
				// Ausgabe der Zahlen
			System.out.println(rund);
			
			// Variable wird in String umgewandelt
			aString = Double.toString(a);
			
		}while(aString.equals(ende));
	}

}
[code=Java]
 
Zuletzt bearbeitet von einem Moderator:
sry

Java:
// Importiert Java Bibliothek
 import java.io.*;
 
//Importiert DecimalFunktion
import java.text.DecimalFormat;

// Eigene Exception erstellen
	class ungueltig_zahl extends Exception{
		public ungueltig_zahl () {}
		public ungueltig_zahl (String meldung){
				super (meldung);
		}
}


// Eigene Klasse 
public class rechner_v2 
{
	static float ungueltig(double a, double b, double c) throws ungueltig_zahl{
		double res;
		res = Math.sqrt(a-b) / c;
		
		// Wenn das Resultat 0 ist
		if (res == 0){
			throw new ungueltig_zahl(""+res);
		}
		// Wenn das Resultat kleiner als Null ist sprich negativ
		if(res > 0){
			throw new ungueltig_zahl(""+res);
		}
		// gibt den Wert zurueck
		return res;
	}
	
	public static void main(String[] args) throws Exception
   	{
		
		// Variable deklarieren
   		double a, b, c, res;
		String aString = "";
		// Beenden des Programmes 
		String ende = "bye";
		// eröffnet das Eingabefld "Einagbe"
		BufferedReader Eingabe = new BufferedReader (new InputStreamReader(System.in));
		
		do{
			System.out.println("Geben Sie drei Zahlen ein");
			// Der User wird aufgefordet die erste Zahl einzugeben
			System.out.print("z1: ");
			// Speichert in Variable a
			a = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die zweite Zahl einzugeben
			System.out.print("z2: ");
			// Speichert in Variable b
			b = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die dritte Zahl einzugeben
			System.out.print("z3: ");
			// Speichert in Variable c
			c = Float.parseFloat(Eingabe.readLine());
			// Die Rechnung wird in Variable res gespeichert
			res = Math.sqrt(a-b) / c;
			
			// Runden auf 2 Kommastellen
			DecimalFormat round = new DecimalFormat("0.00");
			String rund = round.format(res);
			
			try{
					res = calc(f1, f2, op);
			}
			catch(ungueltig_zahl e){
				System.out.println(">> "+e);

			}
			
				// Ausgabe der Zahlen
			System.out.println(rund);
			
			// Variable wird in String umgewandelt
			aString = Double.toString(a);
			
		}while(aString.equals(ende));
	}

}
 
1) Wenn du einen double zurückgeben willst, dann gib besser auch double als Rückgabewert an. (19)
2) Die Methode calc existiert nicht. (68)
3) Die Variablen f1, f2 und op sind nirgends deklariert. (68)
4) Klassennamen IMMER groß und Camcelcast. (8, 17)
5) Für solche Fehler solltest du vielleicht besser von RuntimeException erben.
6) Mit dem Exceptionhandling scheint aber alles zu passen.
 
lol^^
Ich möchte gern drei Zahlen eingeben die dann ausrechnet (Formel sqrt(a-b) / c = x). Das Endresultat dar kein Null sein oder negativ sein. Wenn das Resultat null oder negativ ist soll eine Fehlermeldung erschienen. Irgdenwie kriege ich es nicht hin 🙁 sprich ich wiess nicht wo der Fehler liegt.
Das Ziel ist, das Programm soll bis man "bye" eingibt, weitergfunktionieren.
 
Warum willst du eine eigene Exception erstellen? (Zu Übungszwecken?)

Klassennamen schreibt man mit einem Grossbuchstaben

Liefere doch erst einmal einen Code der wenigstens fehlerfrei kompiliert werden kann!
 
Wie meinst du mit double, ich gebe die doch als Double zurück 😵 ?
*kopfnuss* ja geht ja garn nciht!!
 
Du kannst aber nicht float in die Signatur schreiben, wenn du ein double zurück gibst. Das geht nur, wenn die einen kleineren Wert als angegeben zurückgibst, weil es dazu nicht zu Verlusten kommen kann (z. B. return((byte)0); in int mehode().)
 
Bekomme folgende Fehlermeldung
Java:
Rechner_v2.java:38: possible loss of precision
found   : double
required: float
		return res;
		       ^
rechner_v2.java:74: cannot find symbol
symbol  : method fehler_zahl(double)
location: class rechner_v2
					res = fehler_zahl(res);
					      ^

[Java]
// Importiert Java Bibliothek
import java.io.*;

//Importiert DecimalFunktion
import java.text.DecimalFormat;

// Eigene Exception erstellen
class ungueltig_zahl extends Exception{
public ungueltig_zahl () {}
public ungueltig_zahl (String meldung){
super (meldung);
}
}


// Eigene Klasse
public class RECHNER_V2
{
static float ungueltig(double a, double b, double c) throws ungueltig_zahl{
double res;
res = Math.sqrt(a-b) / c;

// Wenn das Resultat kleiner als Null ist sprich negativ
if(res > 0){
throw new ungueltig_zahl(""+res);
}
// gibt den Wert zurueck
return res;
}

public static void main(String[] args) throws Exception
{

// Variable deklarieren
double a, b, c, res;
String aString = "";
// Beenden des Programmes
String ende = "bye";
// eröffnet das Eingabefld "Einagbe"
BufferedReader Eingabe = new BufferedReader (new InputStreamReader(System.in));

do{
System.out.println("Geben Sie drei Zahlen ein");
// Der User wird aufgefordet die erste Zahl einzugeben
System.out.print("z1: ");
// Speichert in Variable a
a = Float.parseFloat(Eingabe.readLine());
// Der User wird aufgefordet die zweite Zahl einzugeben
System.out.print("z2: ");
// Speichert in Variable b
b = Float.parseFloat(Eingabe.readLine());
// Der User wird aufgefordet die dritte Zahl einzugeben
System.out.print("z3: ");
// Speichert in Variable c
c = Float.parseFloat(Eingabe.readLine());
// Die Rechnung wird in Variable res gespeichert
res = Math.sqrt(a-b) / c;

// Runden auf 2 Kommastellen
DecimalFormat round = new DecimalFormat("0.00");
String rund = round.format(res);

try{
res = fehler_zahl(res);
}
catch(ungueltig_zahl e){
System.out.println(">>"+e);

}

// Ausgabe der Zahlen
System.out.println(rund);

// Variable wird in String umgewandelt
aString = Double.toString(a);
}while(aString.equals(ende));
}

}

[/code]
 
Du kannst aber nicht float in die Signatur schreiben, wenn du ein double zurück gibst. Das geht nur, wenn die einen kleineren Wert als angegeben zurückgibst, weil es dazu nicht zu Verlusten kommen kann (z. B. return((byte)0); in int mehode().)

hmm, komm da nicht gerade draus, was du genau meinst.. was meinst du mit Signatur?

Ich habe doch alle variable als double definiert oder doch net?
 
Java:
  static float ungueltig(double a, double b, double c) throws ungueltig_zahl

wer ein float findet, darf es in double ändern...
 
hi danke, habs selber gemerkt^^, wenn man 2h an einer Skript verbringt.. passiert sowas^^ Danke🙂
Ein Fehler weniger...
Java:
rechner_v2.java:74: cannot find symbol
symbol  : method fehler_zahl(double)
location: class rechner_v2
					res = fehler_zahl(res);

Java:
// Importiert Java Bibliothek
 import java.io.*;
 
//Importiert DecimalFunktion
import java.text.DecimalFormat;

// Eigene Exception erstellen
	class ungueltig_zahl extends Exception{
		public ungueltig_zahl () {}
		public ungueltig_zahl (String meldung){
				super (meldung);
		}
}


// Eigene Klasse 
public class rechner_v2
{
	static double ungueltig(double a, double b, double c) throws ungueltig_zahl{
		double res;
		res = Math.sqrt(a-b) / c;

		// Wenn das Resultat kleiner als Null ist sprich negativ
		if(res < 0){
			throw new ungueltig_zahl(""+res);
		}
		// gibt den Wert zurueck
		return res;
	}
	
	public static void main(String[] args) throws Exception
   	{
		
		// Variable deklarieren
   		double a, b, c, res;
		String aString = "";
		// Beenden des Programmes 
		String ende = "bye";
		// eröffnet das Eingabefld "Einagbe"
		BufferedReader Eingabe = new BufferedReader (new InputStreamReader(System.in));
		
		do{
			System.out.println("Geben Sie drei Zahlen ein");
			// Der User wird aufgefordet die erste Zahl einzugeben
			System.out.print("z1: ");
			// Speichert in Variable a
			a = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die zweite Zahl einzugeben
			System.out.print("z2: ");
			// Speichert in Variable b
			b = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die dritte Zahl einzugeben
			System.out.print("z3: ");
			// Speichert in Variable c
			c = Float.parseFloat(Eingabe.readLine());
			// Die Rechnung wird in Variable res gespeichert
			res = Math.sqrt(a-b) / c;
			
			// Runden auf 2 Kommastellen
			DecimalFormat round = new DecimalFormat("0.00");
			String rund = round.format(res);
			
			try{
					res = fehler_zahl(res);
			}
			catch(ungueltig_zahl e){
				System.out.println(">>"+e);

			}
			
				// Ausgabe der Zahlen
			System.out.println(rund);
			
			// Variable wird in String umgewandelt
			aString = Double.toString(a);
		}while(aString.equals(ende));
	}

}

@Final_Striker
Danke!
 
Danke, jetzt spuckt es keine Fehlermeldung mehr.
Aber die Schleife funkt immer noch net 🙁

Java:
// Importiert Java Bibliothek
 import java.io.*;
 
//Importiert DecimalFunktion
import java.text.DecimalFormat;

// Eigene Exception erstellen
	class ungueltig_zahl extends Exception{
		public ungueltig_zahl () {}
		public ungueltig_zahl (String meldung){
				super (meldung);
		}
}


// Eigene Klasse 
public class rechner_v2
{
	static double ungueltig(double a, double b, double c) throws ungueltig_zahl{
		double res;
		res = Math.sqrt(a-b) / c;

		// Wenn das Resultat kleiner als Null ist sprich negativ
		if(res < 0){
			throw new ungueltig_zahl(""+res);
		}
		// gibt den Wert zurueck
		return res;
	}
	
	public static void main(String[] args) throws Exception
   	{
		
		// Variable deklarieren
   		double a, b, c, res;
		String aString = "";
		// Beenden des Programmes 
		String ende = "bye";
		// eröffnet das Eingabefld "Einagbe"
		BufferedReader Eingabe = new BufferedReader (new InputStreamReader(System.in));
		
		do{
			System.out.println("Geben Sie drei Zahlen ein");
			// Der User wird aufgefordet die erste Zahl einzugeben
			System.out.print("z1: ");
			// Speichert in Variable a
			a = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die zweite Zahl einzugeben
			System.out.print("z2: ");
			// Speichert in Variable b
			b = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die dritte Zahl einzugeben
			System.out.print("z3: ");
			// Speichert in Variable c
			c = Float.parseFloat(Eingabe.readLine());
			// Die Rechnung wird in Variable res gespeichert
			res = Math.sqrt(a-b) / c;
			
			// Runden auf 2 Kommastellen
			DecimalFormat round = new DecimalFormat("0.00");
			String rund = round.format(res);
			
			try{
					res = ungueltig(50, 25, 1);
			}
			catch(ungueltig_zahl e){
				System.out.println(">>"+e);

			}
			
				// Ausgabe der Zahlen
			System.out.println(rund);
			
			// Variable wird in String umgewandelt
			aString = Double.toString(a);
		}while(aString.equals(ende));
	}

}
 
Die Schleife rennt durch, solange aString zeichengleich zu "bye" ist. 🙁 Und das kann es nie sein, weil aString mit a, was vorher ein float ist gefüllt wird.

Und die Klassennamen solltest du endlich auch anpassen.
 
Volvagia ich danke dir 🙂

Aber die Exception funktionieren immer noch net 🙁
Java:
// Importiert Java Bibliothek
 import java.io.*;
 
//Importiert DecimalFunktion
import java.text.DecimalFormat;

// Eigene Exception erstellen
	class ungueltig_zahl extends Exception{
		public ungueltig_zahl () {}
		public ungueltig_zahl (String meldung){
				super (meldung);
		}
}


// Eigene Klasse 
public class RECHNER_V1
{
	static double ungueltig(double a, double b, double c) throws ungueltig_zahl{
		double res;
		res = Math.sqrt(a-b) / c;
		
		
		// Wenn das Resultat kleiner als Null ist sprich negativ
		if(res < 0){
			throw new ungueltig_zahl(""+res);
		}
		// gibt den Wert zurueck
		return res;
	}
	
	public static void main(String[] args) throws Exception
   	{
		
		// Variable deklarieren
   		double a, b, c, res;
		String aString = "";
		// Beenden des Programmes 
		String ende = "bye";
		// eröffnet das Eingabefld "Einagbe"
		BufferedReader Eingabe = new BufferedReader (new InputStreamReader(System.in));
		
		do{
			System.out.println("Geben Sie drei Zahlen ein");
			// Der User wird aufgefordet die erste Zahl einzugeben
			System.out.print("z1: ");
			// Speichert in Variable a
			a = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die zweite Zahl einzugeben
			System.out.print("z2: ");
			// Speichert in Variable b
			b = Float.parseFloat(Eingabe.readLine());
			// Der User wird aufgefordet die dritte Zahl einzugeben
			System.out.print("z3: ");
			// Speichert in Variable c
			c = Float.parseFloat(Eingabe.readLine());
			// Die Rechnung wird in Variable res gespeichert
			res = Math.sqrt(a-b) / c;
			
			// Runden auf 2 Kommastellen
			DecimalFormat round = new DecimalFormat("0.00");
			String rund = round.format(res);
			
			try{
					res = ungueltig(50, 25, 1);
			}
			catch(ungueltig_zahl e){
				System.out.println(">>"+e);

			}
			
				// Ausgabe der Zahlen
			System.out.println(rund);
			
		// Variable wird in String umgewandelt
		aString = Double.toString(a);
		
		}while(aString != ende);
	}

}

Danke schon vorraus
 
Bei mir funktioniert es so einwandfrei:
Java:
import java.io.*;

//Importiert DecimalFunktion
import java.text.DecimalFormat;

class InvalidNumberException extends Exception
{
	public InvalidNumberException()
	{
		this(null);
	}
	public InvalidNumberException(String meldung)
	{
		super (meldung);
	}
}
public class RechnerV1
{
    static double ungueltig(double a, double b, double c) throws InvalidNumberException{
        double res;
        res = Math.sqrt(a-b) / c;
        res = -1; //XXX: HIER
        
        // Wenn das Resultat kleiner als Null ist sprich negativ
        if(res < 0){
            throw new InvalidNumberException(""+res);
        }
        // gibt den Wert zurueck
        return res;
    }
    
    public static void main(String[] args) throws Exception
    {
        
        // Variable deklarieren
        double a, b, c, res;
        String aString = "";
        // Beenden des Programmes 
        String ende = "bye";
        // eröffnet das Eingabefld "Einagbe"
        BufferedReader Eingabe = new BufferedReader (new InputStreamReader(System.in));
        
        do{
            System.out.println("Geben Sie drei Zahlen ein");
            // Der User wird aufgefordet die erste Zahl einzugeben
            System.out.print("z1: ");
            // Speichert in Variable a
            a = Float.parseFloat(Eingabe.readLine());
            // Der User wird aufgefordet die zweite Zahl einzugeben
            System.out.print("z2: ");
            // Speichert in Variable b
            b = Float.parseFloat(Eingabe.readLine());
            // Der User wird aufgefordet die dritte Zahl einzugeben
            System.out.print("z3: ");
            // Speichert in Variable c
            c = Float.parseFloat(Eingabe.readLine());
            // Die Rechnung wird in Variable res gespeichert
            res = Math.sqrt(a-b) / c;
            
            // Runden auf 2 Kommastellen
            DecimalFormat round = new DecimalFormat("0.00");
            String rund = round.format(res);
            
            try
            {
            	res = ungueltig(50, 25, 1);
            }
            catch(InvalidNumberException e){
                System.out.println(">>"+e);
 
            }
            
                // Ausgabe der Zahlen
            System.out.println(rund);
            
        // Variable wird in String umgewandelt
        aString = Double.toString(a);
        
        }
        while(!aString.equals(ende));
    }
}
Nur die Schleife war immer noch nicht richtig.
Ist sie aber immer noch nicht, da aString glücklicher weiße unter Java niemals "bye" werden kann.
 
Ich glaub, dass die Abbruchbedingung für Deine do-while Schleife nicht stimmt. Wenn ich den Code richtig verstehe, willst Du, dass das Programm beendet wird (also die do-while-Schleife verlassen wird), wenn der Nutzer als ersten Parameter "bye" eingibt. Das kann aber nie passieren, weil aString aus einem Double erzeugt wird. Du müsstest also auf Gleichheit mit "bye" prüfen, bevor Du die ganzen parseFloats machst und ggf. mit break die Schleife verlassen.

Und das hier ist Todsünde!
while(aString != ende);
Objektvergleich IMMER mit equals!
 
@ tuttle64
wie meinst du das?
so:
...
boolean true;
aString = Double.toString(a);
}while(aString.CompareTo("bye") == true);
 
Das von tuttle war Ironie^^ Man erkennt den Programmieranfänger an solchen Vergleichen:

Java:
boolean a = true;
if(a == true) {

Is das gleiche wie:

Java:
if(a) {

Wie oben schon geschrieben, musst du den Eingabestring vorher speicehrn, um ihn dann mit eingabe.equals("bye") prüfen zu können. Du wandelst den erst in eine Zahl um (was bei "bye" wohl einen Fehler wirft). Eine Zahl oder einen Fehler kannst du nicht in ein Wort rückumwandeln.
 
Dazu kommt aber, dass du natürlich den Lesevorgang von double auf Zeichenketten umstellen musst.

Das ist mir in der Müdigkeit vor kurzen mit dem Ternären passiert. xD
 
Komme niht mehr nach 🙁

also mit System.out.print("z1: "); fordere ich den Benutzer auf ein Zahl einzugeben, dann speichere ich es in Variable a:
a = Float.parseFloat(Eingabe.readLine());

Dann speichere ich es noch zusätzlich als String ab sprich, wandle in String um:
aString = Double.StringTo(a);

stimmt so?
 
Normalerweiße nimmt man String.valueOf und nicht toString(), aber das ist wohl auch eher Geschmackssache.
Auf jeden Fall kannst du "bye" nicht eingeben, denn bei Float.parseFloat("bye") fliegt dir eine NumberFormatException.
Du musst das Gelesene zuerst in einen String speichern, dort überprüfen und erst wenn du halbwegs sicher bist, dass es eine Zahl ist in einen Float parsen, oder eben darauf reagieren. Du könntest auch die Exception auffangen und damit reagieren, aber das zählt vermutlich zu "Programmflusskontrolle mittels Exception", was man auch nicht macht.
 

Zurück
Oben