kostenloser Webspace werbefrei: lima-city


try ... catch Exceptions - Ein haupt bestandteil Javas?

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    g****e

    Heyho

    Ich hab mal eine Frage:
    Ich versuche gerade Java zu lernen. Der Syntax ist mega einfach, der Code so halb logisch, und dadurch, dass ich C++ und PHP recht gut kann klappts auch so ungefähr. Doch nun ist mir mal aufgefallen bei so kleinen programmen, dass recht viele Programme ein try ... catch erwarten. Arbeitet man in Java dann eher mit sowas:

    public static void main(String[] args) {        
            try {
                //some Code
            }
            catch (Exception e) {
                e.printStackTrace();
            }
    }


    um wirklich immer alle Exceptions zu fangen, und allen funktionen zu genügen? Oder benutzt man die Try...Catch nur Lokal und an bestimmten stellen, wie in C++ und PHP? Da recht viele Funktionen diese Exeptions werfen wollen oder sogar machen, find ich das recht merkwürdig. Sinn kenn ich, aber ist halt eine Stilistische Frage, ob man sowas allgemein auch nutzt.

    Und kann man die Try...Catch schachteln, sodass ich innerhalb eines solchen Konstrukts ein weiteres dieser Konstrukte nutze, das auch nur sich selbst auslöst?

    Und eine dritte und auch letzte Frage: Ich habe gesehen es gibt sehr viele verschiedene Exceptions, muss ich die alle kennen und können, alle berücksichtigen, oder werden sie automatisch zu normalen Exceptions gecastet, sodass ich nur mit denen arbeiten müsste?

    Freue mich über ein wenig input.
    Liebe Grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Das try catch um alles würde ich nicht nutzen. Dann stürzt zwar das Programm außer bei Errors nicht mehr ab, aber es kann auch einige Probleme mit sich bringen, da Exception ja auf einen Fehler aufmerksam machen sollen.

    Try catch lässt sich soweit ich weiß auch schachteln und, wenn du im catch() nicht wieder eine wirfst wird die nächsthöhere natürlich auch nicht ausgelöst, aber Exceptions sollten eben nur für die Fehlerbehandlung und nicht für die allgemeine Programmlogik verwendet werden.
    Wo du das try catch hinsetzt ist eben eine Frage, die nur auf eine bestimmte Situation passend beantwortet werden kann.

    Du brauchst nicht alle zu kennen, du kannst sie auch nachschlagen, wenn sie auftreten, oder du selbst eine werfen möchtest. Immer nur einfache Exceptions abzufangen ist aber recht sinnlos, denn woher willst du jetzt wissen was für ein Fehler aufgetreten ist. Du solltest die Exceptions immer so genau wie möglich abfangen. Das begründet sich mit der Existenz von Runtime Exceptions. Die müssen nicht mit try catch gefangen werden und deuten auf schlechten Code hin (etwa eine Division durch 0). Wenn diese auftreten, und ebenfalls gefangen werden, weil du alle Exceptions fängst, dann wird die Fehlerbehandlung auch dementsprechend falsch ablaufen.

    Beitrag zuletzt geändert: 4.9.2011 15:27:37 von reimann
  4. Genauso wie reimann, würde ich es nicht empfehlen einfach ein try-catch über das gesamte Programm zu stülpen. Macht überhaupt keinen Sinn, da könnte man es auch gleich lassen. Schon aus dem Grund, weil das Programm dann eh beendet wird, egal ob du den Fehler jetzt vorher noch mal gefangen hast oder nicht:-)

    Aber: die Stärke von try-catch liegt nicht in der lokalen Nutzung! Würde man try-catch nur lokal nutzen, dann reicht theoretisch ja auch schon eine if-Abfrage vorher aus, um den Fehler selbst zu bemerken und dann dementsprechend weiter zu handeln.

    Die Stärke des "Ausnahmeabfangsystems" ist, dass du diese an die aufrufenden Programmteile weiterreichen kannst. Der Fehler sollte nur soweit "hochgereicht" werden bis eine passende Stelle gefunden wurde, wo dieser behandelt werden kann. Beispiel: Vor allem bei verschachtelten Funktionsaufrufen kann dies nützlich sein, wenn in den Funktionen bestimmte Fehler auftreten, du sie aber an einer zentralen Stelle behandeln willst. Benutzermeldungen z.B. sollten nicht in irgendwelchen Klassen ausgegeben werden, sondern nur in solchen, die was mit der GUI zu tun haben...

    Ohne try-catch wäre man sonst gezwungen sich ein anderes Konstrukt zusammenzubauen, um Fehler weiterzubehandeln. Dies an sich ist schon recht fehleranfällig.

    Man sollte jedoch beachten, dass die Verwendung von try-catch auch die Performance eines Programms vermindert. In vielen Fällen stört es dies aber nicht. Es stört nur dort, wo z.B. über eine große Schleife etwas wiederholt wird und diese Aktion in einem try-catch-Block ist. Dann muss man sich etwas anderes ausdenken, wenn's zu lange dauert.

    Achso, die Exceptions, die es so gibt: du musst die natürlich nicht auswendig lernen;-) aber an dieser Stelle noch folgender Hinweis (vielleicht weißt du das ja auch schon^^):

    Die Basisklasse für Ausnahmen heißt Exception. Von dieser sind alle Ausnahmeklassen abgeleitet. Und von diesen können noch weitere Ausnahmeklassen abgeleitet werden, und so weiter. Dies kann man ganz gut als Gruppierung verstehen.
    Nehmen wird mal die Ausnahmeklasse ArithmethicException, die z.B. die Division durch Null abfängt. Diese Klasse wird abgeleitet von der Ausnahmeklasse RuntimeException. Solltest du in deinem Programm einige RuntimeExceptions sowie speziell eine ArithmeticException abfangen und behandeln wollen, so musst du auf die Reihenfolge der catch-Blöcke aufpassen (genauso wie in C++ auch).
  5. Autor dieses Themas

    g****e

    Danke ihr beiden, damit hab ich das auch begriffen :)
    Ein weiterer Schritt in Richtung "vllt ist java ja genauso leicht als C++"

    Danke :)
    Liebe Grüße
  6. n*****z

    catch (Exception e) {

    }

    ..fängt Exceptions aller Art ab.

    Jegliche Exceptions (zB NullPointerException, FileNotFoundException und und und) erben von der Exception-Klasse. Das heißt man kann mit Exception e allgemein alle Exceptions abfangen. Jedoch trifft diese catch-Variante auf alle Exceptions zu, dass heißt du kannst nicht genaue Vorgehensweisen zu einzelnen Exceptions machen.


    Da recht viele Funktionen diese Exeptions werfen wollen oder sogar machen, find ich das recht merkwürdig.


    Die Methoden die Exceptions automatisch zu Compilezeiten werfen sind sogenannte Checked Exceptions. Diese muss man zwingend mit try catch behandeln.


    Und eine dritte und auch letzte Frage: Ich habe gesehen es gibt sehr viele verschiedene Exceptions, muss ich die alle kennen und können, alle berücksichtigen, oder werden sie automatisch zu normalen Exceptions gecastet, sodass ich nur mit denen arbeiten müsste?


    Du musst nicht alle Exceptions auswendig kennen (außerdem ist die Anzahl der Exceptions unendlich, da man eigene Exceptions schreiben kann - Vererbung sei Dank).
    Kennst du die Java API Doc?
    http://download.oracle.com/javase/6/docs/api/ (Diese Version ist allerdings für Java 6)
    Die Java API Doc ist eine vollständige Dokumentation der Programmiersprache Java. Dort findest du alle möglichen Klassen und wie diese Klassen aufgebaut sind. Such mal nach den Klassen "Throwable" und "Exception". Unter "Direct Known Subclasses:" findest du alle Klassen die von Exception erben. Quasi "alle" Exceptions die es ohne eigene Implementationen gibt. Du kannst dir ja die Beschreibungen zu den einzelnen Klassen durchlesen und genau gucken was die machen.

    Zusammenfassung: Die vielen verschiedenen Exceptions werden nicht zu "normalen" Exceptions gecastet sondern sind Kindklassen von der Exception-Klasse. Sie erben also von Exception und sind somit auch mehr oder weniger als Exception zusammengefasst. Du kannst mit "normalen" Exceptions arbeiten, allerdings ist das sehr ungenau und man kann nicht verschiedene Exceptions verschieden behandeln. Die vielen Exceptions stehen alle in der API Doc unter "Exception".

    LG
  7. Also im allgemeinen und auch in größeren Projekten sollte man es vermeiden nur "Exception" zu fangen,
    weil es einfach zu allgemein ist und man dann oft nicht mehr entscheiden kann wie mit dem Fehler umzugehen ist.

    Bitte niemals Throwables fangen, damit fängt man nämlich auch Fehler der JVM mit weg (OutOfMemory, StackOverflow etc.) diese sollten nicht vom "fachlichen" Anwendungscode behandelt werden und im Extremfall bis zur main Method propagieren damit die JVM ggf. gestoppt werden kann.

    Übrigens mit Java 7 gibt es dann endlich auch "Multicatch" d.h. es können mehrere Exceptiontypen in einem Block gefangen werden, ein lang ersehntes Feature!.
  8. n*****z


    Übrigens mit Java 7 gibt es dann endlich auch "Multicatch" d.h. es können mehrere Exceptiontypen in einem Block gefangen werden, ein lang ersehntes Feature!.


    Sieht die Syntax dann so aus?:

    // Irgendwelche Beispiel-Exceptions...
    catch (FileNotFoundException f, NullPointerException n) {
    
    }


    Also die Exception-Objekte durch Komma getrennt oder wie?
  9. Hi namphiz,

    fast, das Ganze wird durch das (ich nenne es mal so) Pipe-Symbol getrennt:

    } catch (FirstException | SecondException ex) {
         logger.error(ex);
        throw ex;
    }


    Dieses Feature gehört übrigens zu "Project Coin", indem diverse Spracherweiterungen für Java 7 zusammengefasst wurden.
  10. n*****z

    Danke für den Hinweis.

    Das Symbol ist ein logischer Operator. ;)

    Logische Operatoren:

    & (UND)
    | (ODER)
    < (GRÖSSER ALS)
    > (KLEINER ALS)
    && (UND, Short Circuit Evaluation)
    || (ODER, Short Circuit Evaluation)



    Beitrag zuletzt geändert: 1.11.2011 21:42:13 von namphiz
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!