2009-02-09 9 views

Antwort

16

Weil das eine "Laufzeit" Ausnahme ist.

Runtime wird verwendet, Programmierung Probleme zu identifizieren (das ein guter Programmierer vermeiden kann), während

Checked Ausnahmen Umweltprobleme zu identifizieren sind (also nicht ganz gleich vermieden werden könnte, wie gut programmieren Sie eine Server ausgefallen ist zum Beispiel)

Sie können mehr über them here lesen

Es gibt tatsächlich three kinds of exceptions, nur einer von ihnen sollte h sein andled (die meiste Zeit)

+0

Das ist eine schlechte Beschreibung des Unterschieds zwischen Runtime/checked Ausnahmen. Das ist überhaupt nicht der Unterschied zwischen ihnen. Es gibt 'RuntimeException's, die Sie * fangen sollten, und es gibt überprüfte Ausnahmen, die Sie vermeiden könnten, indem Sie zusätzliche Prüfungen durchführen, bevor Sie die Methode aufrufen. – Aaron

+0

Ex1: 'NumberFormatException' ist eine, die Sie normalerweise fangen sollten. Catching 'NumberFormatException' ist besser als zu versuchen, das Format eines' String' selbst zu überprüfen, bevor man es in eine Zahl umwandelt, da man dann * noch * mit einer 'NumberFormatException' enden kann, die man jetzt nicht abfängt. – Aaron

+0

Ex2: 'IOException' ist eine, die von vielen APIs überall hin geworfen wird. Dies ist wahrscheinlich die am meisten erfasste Ausnahme für mich und die am meisten gefangene Ausnahme, die ich auch in den Codes anderer sehe. Es gibt viele Orte, an denen Sie gezwungen sind, 'IOException' oder seine Unterklassen zu fangen, wo es nie in einigen Kontexten der Verwendung der API, die es wirft, geworfen wird. – Aaron

6

NumberFormatException erweitert RuntimeException, Sie müssen nicht explizit alles behandeln, was von RuntimeException erbt.

Andere RuntimeExceptions sind Dinge wie NullPointerException und IndexOutOfBoundsException. Dies sind Dinge, die der Programmierer vermeiden kann, und das Versuchen, diese Arten von Ausnahmen zu fangen, würde etwas ziemlich unordentlichen Code verursachen.

7
  Throwable 
     / \ 
     Error Exception 
       / \ 
      *checked* RuntimeException 
          \ 
         *unchecked* 

Siehe Thinking in Java für eine gute Erklärung gegen Ungeprüfter Ausnahmen geprüft.

Einige betrachten die Idee der geprüften Ausnahmen als gescheitertes Experiment. Zum Beispiel verwenden sowohl Spring als auch Hibernate ungeprüfte Ausnahmen und umhüllen häufig geprüfte Ausnahmen in unkontrollierten Versionen.

2

Nur ein langer Kommentar zu Toolkits Antwort.

Der Grund Checked Ausnahmen sind ein Problem ist, dass sie schließlich zu Code wie folgt führen:

try { 
    Something that throws an exception 
} catch (Exception e) {} 

Dies ist schlimmster Fall. Vor allem protokollieren sie nicht, dass sie die Ausnahme abfangen. Dies passiert sehr oft und wird fast durch sehr dumme checked Exceptions wie die auf Thread.sleep() ausgelöst, es wirft InterruptedException, die aufgefangen werden MUSS, aber 99% der Zeit ist es dir egal, ob du eins hast oder nicht .

In dem obigen Fall ist es durch die Tatsache, dass Menschen neigen dazu, nur "Ausnahme" fangen, wenn es mehr als einen geworfen werden. Das bedeutet, dass selbst wenn eine kritische ungeprüfte Ausnahme ausgelöst wird, diese abgefangen und ignoriert wird, sodass es praktisch unmöglich ist, das Problem zu finden.

Mehr als einmal war ich in Teams, die ungefähr einen Mann-Monat damit verbringen mussten, auf diese Weise verborgene Fehler zu finden.

Es ist ein gutes Konzept, das schrecklich wird, wenn man hinzufügt, dass Menschen diejenigen sind, die es verantwortungsvoll umsetzen müssen.

Verwandte Themen