Tanja: Java Overflow abfangen

Hallo,

die Frage ist vielleicht etwas einfach aber ich hoffe ihr könnt mir trotzdem weiterhelfen. Ich habe ein kleines Programm im Rahmen der FH Veranstaltung Java Grundlagen geschrieben, welches die Fakultäten von Zahlen berechnet. Nun muss ich einen Overflow abfangen und weiss nicht wie das geht. Der Grund, warum der Overflow bei großen Zahlen erzeugt wird ist mir klar.

Vielen Dank.

T.S.

  1. Hallo,

    Der Programmteil der die Overflow-Exception erzeugt muss in einen catch Block. Danach kommt in einem try Block eine Fehlerroutine.

    catch {
    //Anweisungen, die Exception auslöen können
    }
    try {
    //z.B. Ausgabe, das die eingegebene Zahl zu groß ist
    }

    Gruß,
    Henning

    --
    Gruß aus Braunschweig
    1. Hallo,

      Entschuldige, ich erzähle Mist am frühen Morgen.
      Natürlich muss es so heißen:

      try {
      //Anweisungen die Exception auslösen
      }
      catch (NameDerException e) {
      //Fehlerbehandlung
      }

      Gruß,
      Henning

      --
      Gruß aus Braunschweig
      1. Moin,

        ich vermute, sie erhält einen "java.lang.StackOverflowError".
        Wenn das zutrifft, müsste sie
        a) ein Throwable bzw. Error abfangen
        b) ihre Methode(n) umschreiben, da Throwables/Errors in Produktivsystemen _niemals_ abgefangen werden sollten.

        catch (NameDerException e) {
        //Fehlerbehandlung
        }

        Viele Grüße,
        Martin Jung

        1. Hallo,

          ich vermute, sie erhält einen "java.lang.StackOverflowError".

          Muss nicht. Kann ja auch ein Überlauf in der Zahlvariable sein. Die Gefahr eines Stackoverflow gibt es allenfalls wenn rekursiv berechnet wurde.

          b) ihre Methode(n) umschreiben, da Throwables/Errors in Produktivsystemen _niemals_ abgefangen werden sollten.

          Ja ..... abfangen bedeutet ja, dass man die Sache kontrolliert behandelt und beendet (Files noch zurückschreibt usw.). Ok Errors sind meistens so schwerwiegend, dass auch Folgeoperationen fehlschlagen, aber ich gehe immer noch davon aus, dass im geschilderten Fall eine Exception geworfen wird.

          Gruss
             MichaelB

          1. Hi,

            Muss nicht. Kann ja auch ein Überlauf in der Zahlvariable sein. Die Gefahr eines Stackoverflow gibt es allenfalls wenn rekursiv berechnet wurde.

            Da Tanja schrieb "..welches die Fakultäten von Zahlen berechnet" vermutete ich eine rekursive Lösung und daher einen Error.

            Viele Grüße,
            Martin Jung

    2. Hi, danke für die vielen Antworten...
      Nur das Problem ist, dass es keine Exception gibt wenn im Berechnungsergebnis eine größere Zahl als der erlaubte der deklarierten Variable rauskommt. Es kommen halt komische Ergebnisse raus wie 0 oder negative Zahlen. Das liegt wohl an der Bitverschiebung... oder so...
      Wie kann ich nun einen solchen Überlauf der Variable abfangen? Gibt ja keine Exception aus...

      Danke :)

      Hallo,

      Der Programmteil der die Overflow-Exception erzeugt muss in einen catch Block. Danach kommt in einem try Block eine Fehlerroutine.

      catch {
      //Anweisungen, die Exception auslöen können
      }
      try {
      //z.B. Ausgabe, das die eingegebene Zahl zu groß ist
      }

      Gruß,
      Henning

      1. Hi,

        Nur das Problem ist, dass es keine Exception gibt wenn im Berechnungsergebnis eine größere Zahl als der erlaubte der deklarierten Variable rauskommt. Es kommen halt komische Ergebnisse raus wie 0 oder negative Zahlen. Das liegt wohl an der Bitverschiebung... oder so...
        Wie kann ich nun einen solchen Überlauf der Variable abfangen? Gibt ja keine Exception aus...

        1. wenn Du int-Primitive verwendest, wechsle auf den Typ long

        2. Zur Vermeidung des "Überlaufs" (in Java gibt es keinen "klassischen Überlauf" - es ist Aufgabe des Programmierers sicherzustellen, dass der Wertebereich des verwendeten Typs für die Werte ausreichend ist) verwende eine Abbruchbedingung für die Iteration/Rekursion mittels Min/Max-Werten:
        bei Primitiven vom Typ int -> definiert durch die Konstanten Integer.MIN_VALUE/Integer.MIN_VALUE
        bei Primitiven vom Typ long -> definiert durch die Konstanten Long.MIN_VALUE/Long.MIN_VALUE

        wenn das alles noch nicht reicht, könntest Du noch auf den Typ BigInteger ausweichen (wird aber langsamer, da intern mit Strings gearbeitet wird)

        Viele Grüße,
        Martin Jung