Hier ist eine sehr einfache Lösung für Ihr geprüftes / nicht geprüftes Dilemma.
Regel 1: Stellen Sie sich eine ungeprüfte Ausnahme als testbare Bedingung vor, bevor Code ausgeführt wird. beispielsweise…
x.doSomething(); // the code throws a NullPointerException
wobei x null ist ... ... sollte der Code möglicherweise Folgendes haben ...
if (x==null)
{
//do something below to make sure when x.doSomething() is executed, it won’t throw a NullPointerException.
x = new X();
}
x.doSomething();
Regel 2: Stellen Sie sich eine überprüfte Ausnahme als eine nicht testbare Bedingung vor, die auftreten kann, während der Code ausgeführt wird.
Socket s = new Socket(“google.com”, 80);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
… Im obigen Beispiel ist die URL (google.com) möglicherweise nicht verfügbar, da der DNS-Server nicht verfügbar ist. Selbst in dem Moment, in dem der DNS-Server funktionierte und den Namen "google.com" in eine IP-Adresse auflöste, konnte das Netzwerk jederzeit ausfallen, wenn die Verbindung zu google.com hergestellt wurde. Sie können das Netzwerk einfach nicht die ganze Zeit testen, bevor Sie Streams lesen und schreiben.
Es gibt Zeiten, in denen der Code einfach ausgeführt werden muss, bevor wir feststellen können, ob ein Problem vorliegt. Indem ich Entwickler dazu zwinge, ihren Code so zu schreiben, dass sie gezwungen sind, mit diesen Situationen über Checked Exception umzugehen, muss ich meinen Hut vor dem Schöpfer von Java ziehen, der dieses Konzept erfunden hat.
Im Allgemeinen folgen fast alle APIs in Java den beiden oben genannten Regeln. Wenn Sie versuchen, in eine Datei zu schreiben, wird die Festplatte möglicherweise voll, bevor der Schreibvorgang abgeschlossen wird. Möglicherweise haben andere Prozesse dazu geführt, dass die Festplatte voll wurde. Es gibt einfach keine Möglichkeit, diese Situation zu testen. Für diejenigen, die mit Hardware interagieren, bei denen die Verwendung der Hardware jederzeit fehlschlagen kann, scheinen Checked Exceptions eine elegante Lösung für dieses Problem zu sein.
Dies hat eine Grauzone. Für den Fall, dass viele Tests erforderlich sind (eine umwerfende if-Anweisung mit vielen && und ||), wird als Ausnahme eine CheckedException ausgelöst, einfach weil es zu schmerzhaft ist, um es richtig zu machen - Sie können dieses Problem einfach nicht sagen ist ein Programmierfehler. Wenn es viel weniger als 10 Tests gibt (z. B. 'if (x == null)'), sollte der Programmiererfehler eine UncheckedException sein.
Im Umgang mit Sprachdolmetschern wird es interessant. Sollte ein Syntaxfehler gemäß den oben genannten Regeln als geprüfte oder ungeprüfte Ausnahme betrachtet werden? Ich würde argumentieren, dass wenn die Syntax der Sprache getestet werden kann, bevor sie ausgeführt wird, es eine UncheckedException sein sollte. Wenn die Sprache nicht getestet werden kann - ähnlich wie Assembler-Code auf einem PC ausgeführt wird - sollte der Syntaxfehler eine überprüfte Ausnahme sein.
Die beiden oben genannten Regeln werden wahrscheinlich 90% Ihrer Bedenken beseitigen, aus denen Sie auswählen können. Um die Regeln zusammenzufassen, folgen Sie diesem Muster… 1) Wenn der auszuführende Code getestet werden kann, bevor er ausgeführt wird, damit er ordnungsgemäß ausgeführt wird, und wenn eine Ausnahme auftritt - auch bekannt als Programmiererfehler -, sollte die Ausnahme eine UncheckedException (eine Unterklasse von RuntimeException) sein ). 2) Wenn der auszuführende Code nicht getestet werden kann, bevor er ausgeführt wird, damit er ordnungsgemäß ausgeführt wird, sollte die Ausnahme eine geprüfte Ausnahme sein (eine Unterklasse der Ausnahme).