Frage

Ich habe eine Funktion, die eine ID-Nummer zurück, wenn das Argument in der Datenbank vorhanden ist. Wenn nicht, wird null zurückgegeben. Bettelt dies für eine Null-Zeiger-Ausnahme? Negative ID-Nummern sind nicht erlaubt, aber ich dachte, es wäre klarer Argumente haben nicht existent null zurückkehrt, anstatt einen Fehlercode wie -1. Was denken Sie?

private Integer tidOfTerm(String name) throws SQLException {
    String sql = "SELECT tid FROM term_data WHERE name = ?";
    PreparedStatement prep = conn.prepareStatement(sql);
    prep.setString(1, name);
    ResultSet result = prep.getResultSet();

    if (result.next()) {
        return result.getInt("tid");
    }

    return null; // TODO: is this begging for a null pointer exception?
}
War es hilfreich?

Lösung

Das ist vollkommen legal. Wenn Sie eine NPE vermeiden wollen, werfen Sie eine benutzerdefinierte Ausnahme. Aber nicht eine negative Zahl zurück. Wenn der Anrufer nicht den Rückgabewert überprüft, werden Sie immer ein Problem haben. Aber tun false Berechnung (weil das Ergebnis zum Beispiel ist, multipliziert mit -1) ist auf jeden Fall schwieriger zu debuggen als eine uncatched Ausnahme.

Andere Tipps

einen null im Fall eines Lookup-Rückkehr, die kein Ergebnis geben, ist ein normales Verfahren zur Darstellung Nicht-Existenz. Ich würde es in diesem Fall wählen. (Lookup-Methoden für die Standard-Java-Map-Klassen sind ein Beispiel für die Verwendung von null falls die Karte keinen Schlüssel enthält.)

Wie für einen besonderen Wert für die ID-Rückkehr, würde ich nur tun vorschlagen, wenn Ihr System enthält bereits spezielle Werte repesenting spezielle IDs.

Eine weitere oft gehörte Möglichkeit, eine Ausnahme in diesem Fall wirft. Es ist nicht klug, aber zu verwenden Ausnahmen Zustand zu übergeben, so würde ich das auch nicht tun.

Ich denke, es ist legitim null in diesem Fall zurückzukehren. So stellen Sie sicher, dass die Absicht ordnungsgemäß dokumentiert ist.

einen negativen Wert in diesem Fall zurückkehrend wäre in Ordnung, aber es ist nicht eine Allround-Lösung. Was passiert, wenn negative Werte wurden in der db erlaubt?

Bearbeiten : Ich möchte auf SO in Bezug auf Rückkehr Nullen oder leere Listen (oder Arrays) ein Wort über die damit verbundenen Diskussionen hinzuzufügen. Ich bin für die Rückkehr leere Listen oder Arrays anstelle von null, aber der Kontext ist anders. Wenn Sie eine Liste zu erhalten versuchen, ist es in der Regel Teil eines übergeordneten Objekt, und es macht tatsächlich Sinn für das übergeordnete Objekt eine leere Liste zu haben, anstatt eine Null-Referenz. In diesem Fall hat null Bedeutung (= nicht gefunden), und es gibt keinen Grund, es zu vermeiden, zurück.

Ich hoffe, das ist keine wirkliche Methode für Sie. Sie sind nicht zu schließen Statement oder ResultSet in Verfahren Umfang.

  • Do not einen Fehlercode verwenden! Welcher Wert ist der Fehler? es wird nie einen rechtlichen Rückgabewert werden? Nichts gewonnen.

  • Null ist nicht gut. Die meisten Anrufer-Code ein, wenn nicht NULL-Prüfung für das Ergebnis zu tun haben. Und einige Male die Auswahl kann null zurück. Sollte es als keine Zeile behandelt anders sein?

  • Werfen Sie eine Ausnahme wie NoSuchElementException statt die Rückkehr null. Es ist eine ungeprüfte Ausnahme, der Anrufer kann damit umgehen oder sie verzichten. Und wenn der Anrufer zu handhaben will, der Try-Catch ist nicht komplizierter als ein, wenn nicht null.

Ich schlage vor, Sie die Möglichkeit, Muster betrachten.

Die Option Muster dient als Wrapper um Ihre zurück Art und definiert zwei Sonderfälle: option.none () und option.some (). Auf diese Weise, können Sie immer Ihre zurück Typ kennen (eine Option), und prüfen Sie, wenn Sie einen Wert in Ihrem zurückgegeben Option bezwecken unter Verwendung von Methoden wie option.isSome () und option.isNone ().

Auf diese Weise können Sie garantieren, keinen unkontrollierten nulls haben.

Natürlich all dies geht auf Kosten der zusätzlichen Komplexität des Codes.

Weitere Informationen über die Option Typ finden Sie unter hier ( Scala-Code, aber gleiches Prinzip)

Nein, wird es nicht. Es wird nur eine NPE werfen, wenn Sie Operationen auf sie danach tun, als ob es sich um eine primitive ist es ohne nullchecking. Z.B. i++ und so weiter. Ihr Beispiel gilt (erwartet aus, dass der JDBC-Code selbst Ressourcen undicht). Wenn Sie nicht den tatsächlichen id benötigen, dann können Sie auf der anderen Seite auch nur ein boolean zurück.

Es könnte große Schwierigkeiten für unerfahrenen Anwender führen. Guter Programmierer wird erkennen, dass, wenn der Name ungültig dann null ist möglicherweise zurückgegeben werden. Having said, dass je mehr Standard Sache ist etwas exception zu werfen.

könnte in Kombination von Autoboxing schwierig sein. Wenn ich das tue:

final int tid = tidForTerm("term");

Und "Begriff" existiert nicht, ich werde eine NPE bekommen, weil Java versucht, ein Integer (null) zu einem primitiven int unbox.

Dennoch gibt es Fälle, in denen es eigentlich gut ist null zu verwenden, für die ganzen Zahlen. In Einheiten optional int-Werten, z.B. die Bevölkerung einer Stadt. In diesem Fall würde null bedeuten, keine Informationen verfügbar.

Ein interessantes Problem und eine große Anzahl von möglichen Lösungen:

  1. Erstellen Sie eine HasArgument Methode und Benutzer benötigen es zu nennen, Problem kann dies langsam und dupplicate Arbeit
  2. sein
  3. Werfen Sie eine Ausnahme, wenn ein Wert nicht in der Datenbank ist, sollte nur verwendet werden, wenn diese unerwartet
  4. Verwenden Sie zusätzliche Werte eine ungültige Rückkehr, um anzuzeigen, null und negative Werte für Sie funktionieren würde, aber wenn nicht geprüft könnten sie Probleme später im Code führen.
  5. Zurück ein Wrapper mit einem isValid () und eine Methode getValue (), wo getValue () eine Ausnahme auslöst, wenn es ungültig ist. Dies würde die Probleme von 1 lösen und 3, aber vielleicht ein bisschen mutch sein.

Ich würde sagen, dass die beste Lösung hängt davon ab, was Ihre Methode benannt ist, und Sie sollten sich überlegen, was Ihre Methoden so viel genannt werden als ob sie null zurückgeben sollte oder eine Ausnahme aus.

tidOfTerm mir bedeutet, dass der Begriff wird voraussichtlich existieren, so zu entdecken, dass man nicht sollte nicht gibt eine Ausnahme aus.

Wenn der Begriff Name unter der Kontrolle des eigenen Code ist, und finden es nicht einen Fehler im Code oder der Umgebung gibt, dann könnten Sie eine Illegal werfen wollen.

Wenn der Begriff Name Argument nicht unter Kontrolle ist, und nicht einen gültigen Begriff zu finden, ist eine absolut gültige Situation, dann würde ich Ihre Methode, um so etwas wie findTidForTermName benennen Sie einen leichten Hauch zu geben, dass eine Art von Suche wird sein, deshalb durchgeführt, und es besteht die Möglichkeit, dass die Suche nichts finden können.

Ich bin mit den Plakaten. Integer ist ein Wrapper und als solche sollten für Berechnungen, Konvertierungen, etc. verwendet werden (was ich denke, Sie beabsichtigen, zu tun). Verwenden Sie keine Null zurückzukehren, verwenden Sie eine negative Zahl ... es ist ein bisschen eleganter und ermöglicht es Ihnen, für mehr Kontrolle. IMHO.

Bitte nicht schreiben Code, den Wert null zurück. Dies bedeutet, dass jeder Anruf, um Ihren Code muss Check für null, um robust zu sein. Jedes Mal. Immer.

Betrachten wir eine Liste stattdessen enthält Anzahl der Rückgabewerte der Rückkehr, die Null sein kann.

Ja, es sollte eine NPE verursachen und Ja, Sie sollten kontrollieren, dass in der Aufruf der Methode (oder einem anderen geeigneten Ort). Der wahrscheinlichste Grund, warum Ihre Methode NULL zurück, wenn es keine Aufzeichnungen sind und die richtige Art und Weise zu behandeln, die durch das Auslösen einer Ausnahme. Und die perfekte Ausnahme, jemanden zu sagen, dass Sie nicht haben, was er verlangte NPE ist.

Rückgabe eines Fehlercodes (zB -1) ist nicht gut, weil:

a) wenn es viele Fehler, die Sie behandeln möchten (zB kann nicht DB lesen kann DB lesen, aber Objekt existiert nicht in DB, gefundenes Objekt aber etwas beschädigt ist, etc), dann Code ein Fehler zurückgegeben unterscheidet nicht zwischen die Arten von Fehlern.

b) in der Zukunft, wenn -1 einen gesetzlichen Begriff id wird, dann wird es schwer sein, sie zu ändern (wenn Sie verwenden müssen, -1, dann (EDIT: in C) zumindest tun #define ERRORCODE -1 und Verwendung ERRORCODE überall)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top