Fraenk: Exceptions in Funktionen (Rückgabe)

Hallo zusammen,

aus einem Servlet heraus möchte ich in der Klasse "Berechnungen" die Funktion "getTeilen" aufrufen:

int demoInt = getTeilen(a,b);

Die Funktion getTeilen sieht dann ungefähr so aus:

public class Berechnungen{
 public Berechnungen() {
 }
 public int getTeilen(int a, int b) {
  String result = new String();
         try {
                  return a/b;
  } catch (Exception e) {
    result = "Division durch 0";
  }
 }
}

So, und jetzt möchte ich gerne im Servlet wissen, ob die Berechnung erfolgreich war oder ob die Exception zugeschlagen hat. "result" ist aber ein String und kann ja nicht zurückgegeben werden, da die Funktion vom Typ int ist...

Wie kann man dieses Problem (elegant) lösen?

Danke und Grüße
Fraenk

  1. Guude!

    Wie kann man dieses Problem (elegant) lösen?

    Entweder bleibst Du beim Rückgabetyp int (wobei ich bei Divisionen float nehmen würde aufgrund möglicher Kommazahlen), baust die Methode getTeilen() folgendermaßen um:

    ...
    public int getTeilen(int a, int b) {
       try {
          return a/b;
       } catch(Exception e) {
          return null;
       }
    }
    ...

    und fragst im Servlet ab, ob der Rückgabewert null ist, oder Du gibst einen String zurück (was weniger elegant ist):

    ...
    public String getTeilen(int a, int b) {
       try {
          return a/b + "";
       } catch(Exception e) {
          return "Fehler"; // muss ja nicht gleich eine
                           // Division durch "0" sein
       }
    }
    ...

    Wie gesagt: Erstes Beispiel ist eleganter, sollte aber float zurückgeben. Exceptions können auch bei einem Überlauf des Wertebereichs auftreten, weshalb die Abfrage _irgendeiner_ Exception keine genaue Auskunft über die Art des aufgetretenen Fehlers gibt. Eine pauschale Aussage wie "Division durch'0'" ist daher unpassend.

    LG ausm Hesseland
    Lemmy

    --
    Wer seiner Frau gegenüber stets beteuert, dass DAS tatsächlich 30cm sind, darf sich nicht wundern, wenn sie nicht richtig einparken kann...
    1. Hallo,

      ...
      public int getTeilen(int a, int b) {
         try {
            return a/b;
         } catch(Exception e) {
            return null;
         }
      }

      Bist Du sicher, dass der primitive Typ int den Wert null bekommen darf?

      viele Grüße

      Axel

      1. Guude!

        Bist Du sicher, dass der primitive Typ int den Wert null bekommen darf?

        Ups, hast ja recht, darf er natürlich nicht...

        LG ausm Hesseland
        Lemmy

        --
        Wer seiner Frau gegenüber stets beteuert, dass DAS tatsächlich 30cm sind, darf sich nicht wundern, wenn sie nicht richtig einparken kann...
  2. Hallo,

    aus einem Servlet heraus möchte ich in der Klasse "Berechnungen" die Funktion "getTeilen" aufrufen:

    int demoInt = getTeilen(a,b);

    Die Funktion getTeilen sieht dann ungefähr so aus:

    public class Berechnungen{
     public Berechnungen() {
     }
     public int getTeilen(int a, int b) {
      String result = new String();
             try {
                      return a/b;
      } catch (Exception e) {
        result = "Division durch 0";
      }
     }
    }

    Das gibt einen Compiler-Fehler:
    missing return statement
     public int getTeilen(int a, int b) {
                                        ^
    1 error

    Irgendwas _musst_ Du auch im Catch-Zweig zurückgeben.

    So, und jetzt möchte ich gerne im Servlet wissen, ob die Berechnung erfolgreich war oder ob die Exception zugeschlagen hat. "result" ist aber ein String und kann ja nicht zurückgegeben werden, da die Funktion vom Typ int ist...

    Wie kann man dieses Problem (elegant) lösen?

    Willst Du _wirklich_ das Ergebnis der Division als _Ganzzahlwert_ haben? Dann würde ich in der Klasse Berechnungen einen String Meldung und eine Methode getMeldung() definieren, in der eventuelle Fehler angezeigt werden. Wenn es Dir egal ist, welcher Fehler, dann würde auch ein boolean Fehler (false/true) reichen.

    Du kannst aber auch grundsätzlich mit Floats rechnen. Eine Float-Division durch 0 ist allerdings _kein_ Fehler, sondern ergibt Infinity. Das kann allerdings auch mit Float.isInfinite() geprüft werden.
    http://java.sun.com/j2se/1.3/docs/api/java/lang/Float.html

    import java.lang.*;

    public class bsp {
      public static void main(String[] args) {
        int demoInt;
        float demoFloat;
        String Meldung = new String();

    Berechnungen b = new Berechnungen();
        demoInt = b.getTeilen(7,3);
        Meldung = b.getMeldung();
        System.out.println(Meldung);
        System.out.println(demoInt);

    demoInt = b.getTeilen(5,0);
        Meldung = b.getMeldung();
        System.out.println(Meldung);
        System.out.println(demoInt);

    demoFloat = b.getTeilen2(7,3);
        Meldung = b.getMeldung();
        System.out.println(Meldung);
        System.out.println(demoFloat);

    demoFloat = b.getTeilen2(5,0);
        Meldung = b.getMeldung();
        System.out.println(Meldung);
        System.out.println(demoFloat);
      }
    }

    class Berechnungen{
     private String Meldung = new String();

    Berechnungen() {
        Meldung = "init";
     }

    public String getMeldung() {
        return Meldung;
     }

    public int getTeilen(int a, int b) {
      try {
        Meldung = "Operation erfolgreich abgeschlossen.";
        return a/b;
      } catch (Exception e) {
        Meldung = "Fehler: ".concat(e.getMessage());
        return 0;
      }
     }

    public float getTeilen2(int a, int b) {
      try {
        Meldung = "Operation erfolgreich abgeschlossen.";
        return (float)a/(float)b;
      } catch (Exception e) {
        Meldung = "Fehler: ".concat(e.getMessage());
        return 0;
      }
     }
    }

    viele Grüße

    Axel

  3. Hallo!

    Danke für die Anregungen! Bin jetzt wohl auf der richtigen Spur!

    Merci ;-)
    Fraenk