Exception soll Werte mitgeliefert bekommen

Mim92

Mitglied
Hallo,
Ich habe in meinem Taschenrechner Programm eine Methode zur Berechnung der Fakultät, die im Fall eines IntOverflows eine Exception wirft, die in der Main abgefangen wird. Jetzt möchte ich im catch-Block aber Werte aus der Fakultät Methode ausgeben. Kann mir jemand sagen, wie ich das anstelle?

Hier die Fakultät Methode:
Java:
    static int fakultaet(int z) throws ResultErrorException {

        int fakultaet = 1, zwischenspeicher = 1;

        while (z > 1) {
            zwischenspeicher = fakultaet;
            fakultaet = fakultaet * z;
            if (fakultaet / z != zwischenspeicher) {
           
                throw new ResultErrorException();
                //Im catch Block wird "IntOverflow" ausgegeben
            }
            z = z - 1;
        }
        return fakultaet;
    }
Hier der catch Block aus der Main:
Java:
catch (ResultErrorException e) {
                System.out.println("IntOverflow!!");
            }
Jetzt würde ich gerne die Variable "zwischenspeicher" im catch Block ausgeben. Geht das ?
 
Hallo,

du könntest eine getter-Methode einführen, dazu musst du aber zwischenspeicher in der Klasse von fakultaet also bspw.:

Java:
class Rechner {
     int zwischenspeicher;
     //..........
    int getZwischenspeicher() {
         return zwischenspeicher;
    }

In der Main dann:
Java:
catch (ResultErrorException e) {
                System.out.println("IntOverflow!!" + Rechner.getZwischenspeicher + "is too big!!");
}

Ich hoffe ich konnte dir .

Mit freundlichen Grüßen bolli24
 
Du kannst dir eine entsprechende IntOverflow exception schreiben und ihr eine entsprechende Variable mitgeben:
Java:
public class IntOverflowException : ResultErrorException {
  public final int zwischenspeicher;
  public IntOverflowException(int z) {
    zwischenspeicher = z;
  }
}
 
Hey, Danke für die vielen Antworten. Also zu InfectedBytes,
was genau bedeutet der Doppelpunkt zwischen IntOverflowException und ResulErrorException? Muss ich dann beim Auslösen der IntOverflowException in die Klammern dahinter "zwischenspeicher schreiben, um die Variable zu übergeben? Und wie sieht es dann mit dem Catch Block aus? Schreibe ich dann im Catch Block "System.out.println("IntOverflow!!"+z+"is too big!!");"?
 
Also Ich lade mal das ganze Programm hoch.
Java:
import java.util.InputMismatchException;
import java.util.Scanner;

public class Calculator2 {
    private static void gibEingabeHilfe() {
        System.out.println("Einfacher Taschenrechner");
        System.out.println("bitte jeweils Operator plus Zahl eingeben:");
        System.out.println("(c=clear,e=ende)");
    }

    static int ganzZahl(double x) throws NotNaturalNumberException {
        if (x / (int) x > 1.000000000000001) {
            throw new NotNaturalNumberException();
        }
        /*
         * wenn es sich um keine Ganzzahl handelt, dann muss die Kommazahl durch
         * die nächstkleinere Ganzzahl größer als 1 sein. In diesem Fall gibt es
         * eine Exception, sodass keine weitere Berechnung ausgeführt wird.
         */
        return (int) x;
    }

    static int fakultaet(int z) throws ResultErrorException {

        int fakultaet = 1, zwischenspeicher = 1;

        while (z > 1) {
            zwischenspeicher = fakultaet;
            fakultaet = fakultaet * z;
            if (fakultaet / z != zwischenspeicher) {
           
                throw new ResultErrorException();
            }
            z = z - 1;
        }
        return fakultaet;
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        double ergebnis = 0, operand = 0;

        boolean nochMal = true;

        System.out.println("Taschenrechner");
        gibEingabeHilfe();

        do {
            System.out.print(ergebnis);
            String eingabe = input.nextLine();
            char operator = eingabe.charAt(0);
            Scanner newScanner = new Scanner(eingabe.substring(1));
            try {
                switch (operator) {
                case '+':
                    operand = newScanner.nextDouble();
                    ergebnis = ergebnis + operand;
                    break;
                case '-':
                    operand = newScanner.nextDouble();
                    ergebnis = ergebnis - operand;
                    break;
                case '/':
                    operand = newScanner.nextDouble();
                    if (operand == 0)
                        throw new DivideByZeroException();
                    ergebnis = ergebnis / operand;
                    break;
                case '*':
                    operand = newScanner.nextDouble();
                    ergebnis = ergebnis * operand;
                    break;
                case '!':
                    if (newScanner.hasNextDouble())
                        throw new InvalidOperationException();
                    ergebnis = fakultaet(ganzZahl(ergebnis));
                    break;
                case 'c':
                    if (newScanner.hasNextDouble())
                        throw new InvalidOperationException();
                    ergebnis = 0;
                    break;
                case 'e':
                    if (newScanner.hasNextDouble())
                        throw new InvalidOperationException();
                    nochMal = false;
                    break;
                default:
                    throw new InvalidOperatorException();

                }

            } catch (ResultErrorException e) {
                System.out.println("IntOverflow!!");
            } catch (NotNaturalNumberException e) {
                System.out.println("Fakultät ist nur für natürliche Zahlen definiert.");
            } catch (InvalidOperatorException e) {
                System.out.println("Unbekannter Operator");
            } catch (InputMismatchException e) {
                System.out.println("Bitte eine Zahl eingeben!");
            } catch (DivideByZeroException e) {
                System.out.println("div 0");
            } catch (InvalidOperationException e) {
                System.out.println("Unbekannte Operation");
            } catch (Exception e) {
                System.out.println("Unbekannter Fehler");
            }
        } while (nochMal);
    }

}
Im Catch Block bei ResultErrorException soll jetzt die Variable zwischenspeicher aus der Methode fakultaet auftauchen.
 
Hey, Danke für die vielen Antworten. Also zu InfectedBytes,
was genau bedeutet der Doppelpunkt zwischen IntOverflowException und ResulErrorException? Muss ich dann beim Auslösen der IntOverflowException in die Klammern dahinter "zwischenspeicher schreiben, um die Variable zu übergeben? Und wie sieht es dann mit dem Catch Block aus? Schreibe ich dann im Catch Block "System.out.println("IntOverflow!!"+z+"is too big!!");"?

oh sorry, der Doppelpunkt is C++ bzw. C# Syntax.
In java musst du den Doppelpunkt durch "extends" ersetzen

Du wirfst dann eben eine IntOverflowException, welche du mittels try/catch fängst:
Java:
try {

} catch(IntOverflowException e) {
  System.out.println(e.zwischenspeicher);
}
 
Hallo nochmal,
Ich versteh noch nicht so ganz. Werfe in der Fakultät Methode immer noch die ResultErrorException. Habe die Exception "IntOverflowException" geschrieben, genauso, wie InfectedBytes es gesagt hat. Mit "extends" statt dem Doppelpunkt. Im Catch Block stehen nun beide Exceptions, aber nur die ResultErrorException wird ausgelöst.
Meine ResultErrorException sieht momentan so aus :
Java:
public class ResultErrorException extends Exception {

    public ResultErrorException() {
        super("Intoverflow!!");
    }
Ich muss wohl erst diese Exception so abändern, dass sie Werte mitgeliefert bekommt, damit die IntOverflowException überhaupt erst von ihr den Wert für "zwischenspeicher" bekommen kann ?​
 
Du hast eine ResultErrorException geschrieben, keine IntOverflowException !! Und ja, du brauchst entweder einen passenden Konstruktor oder setter und getter
 

Neue Themen


Zurück
Oben