Die Ausnahme ist dazu da, dass der Programmierer eines Tasks sich nicht selbst um das Problem kümmern muss. (1): Falls das Problem für ihn NICHT LOGISCH ist, um es im Task zu behandeln. Ein Task, der eine Zeichenkette aus einem Stream liest, sollte keinen Plattenfehler behandeln, nicht wahr? Aber es sollte sehr logisch sein, damit umzugehen, wenn die Daten keinen String enthalten.
(2): Er kann es nicht allein bewältigen (nicht genügend Informationen) Eine Aufgabe zum Lesen einer Zeichenkette aus einer Datei und einer nicht gefundenen Datei kann den Benutzer auffordern, eine andere Datei auszuwählen, aber wie kann die Aufgabe wissen, in welchem Ordner sich die Datei befinden könnte und welche Erweiterung die Datei haben könnte. Wie kann die Aufgabe ohne dieses Wissen eine grafische Benutzeroberfläche erstellen, um diese Frage erneut zu stellen?
(3): Es gibt keine logische (oder handhabbare) Möglichkeit, zwischen verschiedenen Rückgaben zu unterscheiden. Wenn eine Aufgabe die Datei nicht lesen kann und null zurückgibt. Was ist, wenn die Datei das falsche Format hat und ebenfalls null zurückgibt? Wie können sich diese beiden unterscheiden? Ausnahmen können verwendet werden, um dies zu unterscheiden. Deshalb nennt man sie auch Exception :-D.
(4): Es gibt viele ähnliche Aufgaben, die ähnlich gehandhabt werden müssen, und das Schreiben von Code für alle Aufgaben ist schwer zu pflegen. Das Schreiben des Handle-Codes für alle Zugriffe kann zu einem Chaos führen, da viele Duplikationen erforderlich sein können.
interface DBAccess {
public Result accessDB();
}
class DBOperation {
static public void DoOperation(DBAccess pAccess) {
try { return DBAccess.accessDB(); }
catch(InvalidDBPasswordException IPE) {
// Do anything about invalid password
}
catch(DBConnectionLostException DBCLE) {
// Do anything about database connection lost
}
// Catch all possible DB problem
}
}
...
private User[] ShowUserList_and_ReturnUsers() {
// Find the used.
// Show user list
if (Users.count() == 0)
return null;
else return Users;
// No need to handle DB connection problem here
}
private User[] GetUserProfile() {
// Find the used and return
// No need to handle DB connection problem here
}
...
/** An onClick event to show user list */ {
DBOperation.DoOperation(new DBAccess() {
public Result accessDB() {
return ShowUserList_and_ReturnUsers();
}
});
}
/** An onClick event to show a user profile */ {
DBOperation.DoOperation(new DBAccess() {
public Result accessDB() {
return GetUserProfile();
}
});
}
... Many more DB access
(5): Das Schreiben aller Fehlerprüfungen erschwert oder verlangsamt die Aufgabe. Das obige Problem sollte zeigen, wie es helfen kann, die Komplikation zu reduzieren. Hier ist, wie es helfen, nicht zu verlangsamen.
for(int i = 0; i < Users.length; i++) {
User aUser = Users[i];
// Do something with user
}
Replaced with
try {
for(int i = 0; ; i++) {
User aUser = Users[i];
// Do something with user
}
}
catch(ArrayOutOfBoundException AOBE) {}
Der Ersatzcode ist leistungsfähiger, wenn die Anzahl der Benutzer groß ist.
Sollte man beim Auftreten eines Datenbankfehlers einen Nullwert und einen Fehlercode zurückgeben oder die Ausnahme auslösen? Antwort: Je nachdem, um welche Art von Fehler es sich handelt. Wenn man zum Beispiel einen Benutzer nicht finden kann, ist das kein Fehler. Aber wenn das Passwort falsch ist oder die Verbindung unterbrochen ist, sind dies Fehler, da der Versuch, dies auf normale Weise zu behandeln, das Programm verkompliziert.
(1). Hat die übermäßige Verwendung von try-catch() negative Auswirkungen auf die Leistung? Antwort: Laut "Effective Java" hat es nur sehr geringe Auswirkungen (nur in Schleifen nicht gut), soweit ich mich erinnere (ich habe das Buch jetzt nicht bei mir).
(2). Ist die Verwendung bestimmter Ausnahmetypen besser? Antwort: Benutzerspezifische Ausnahmen sind besser, um zu vermeiden, dass das falsche Problem gelöst wird.
Was ist, wenn ich es versäumt habe, eine der X möglichen Ausnahmen abzufangen, die auftreten können? Ehrlich gesagt habe ich in 2-3 Jahren nur 10 % der Java-Standardausnahmen gehört und verwendet, denke ich. Antwort: Genauso wie Sie den Fehler ohne Ausnahme behandeln, können Sie ihn auch übersehen. Sie fügen sie einfach hinzu, wenn Sie das herausfinden.
Ja, jemand hat gesagt, dass der Aufrufer, wenn er nicht weiß, wie er mit den geworfenen Ausnahmen umgehen soll, NICHT das RECHT haben sollte, die Wurfmethode aufzurufen. Ist das richtig? Antwort: Nein, wenn ich nicht weiß, was ich mit einer Ausnahme machen soll, werfe ich sie erneut.
(3). Ich habe diesen Artikel von Anders Hejlsberg gelesen, der besagt, dass geprüfte Ausnahmen schlecht sind. Sollte das bedeuten, dass es in manchen Fällen ratsam ist, Ausnahmen zu schlucken? Antwort: Ich denke, er spricht über "Checking exception" als eine Funktion für den Compiler, um sicherzustellen, dass eine Ausnahme behandelt werden sollte. Die Idee, eine Ausnahme zu haben.
(4). Ein Bild sagt mehr als 1000 Worte..ich denke, einige Beispiele werden hier sehr helfen. Antwort: Der obige Code.
Ich habe jetzt den Lauf .... Sorry ... :-p (Bin gleich da, Schatz!!)