if(null-check)-else vs try catch(NullPointerException) was ist effizienter?
Welche der folgenden drei Funktionen ist effizienter;
public String getmConnectedDeviceName1() {
if(null != mServerDevice) {
return mServerDevice.getName();
}
else {
return null;
}
}
public String getmConnectedDeviceName2() {
return mServerDevice == null ? null : mServerDevice.getName();
}
public String getmConnectedDeviceName3() {
try{
return mServerDevice.getName();
}
catch(NullPointerException e) {
return null;
}
}
Bitte Antworten Sie mit konkreten akzeptable Logik.
- Es gibt keine Logik anwenden. Trapping Ausnahmen-test für null-Werten ist einfach nur falsch.
- die Frage war nicht um richtig oder falsch. es wurde über die Effizienz. Lesen Sie die Frage sorgfältig durch.
- OK. Also absichtlich abfangen einer Ausnahme ist ineffizient, da die Antworten erklären. Unabhängig davon, dass die richtige Praxis überschreibt Effizienz in fast allen Fällen. In diesem Fall, wie in den meisten anderen, die richtige Praxis ist auch die effizienteste.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersteres ist viel effizienter, wenn
mServerDevice
istnull
. WennmServerDevice
ist nichtnull
beide sind ungefähr gleich. Vergleich mitnull
ist nur der Vergleich zweier 32-bit-Ganzzahlen, die sehr schnelle Bedienung. Eine Ausnahme ist teuer, weil neue Objekte werden sollte, erstellt und den stack-trace sollte gefüllt werden.Trenary Betreiber
... ? ... : ...
ist genau so effizient wieif (...) ... else ...
Aussage, denn beide sind übersetzt, um den gleichen bytecode.Gut, es gibt keine Notwendigkeit für die "rückwärts" - Vergleich (meist ein überbleibsel aus der C, wo ein Tippfehler könnten unentdeckt bleiben, wenn Sie mit einer schlechten compiler oder ignoriert Warnungen) - und der bedingte operator macht die Dinge einfacher:
Oder:
Dies ist sowohl mehr lesbar und effizienter als Fang
NullPointerException
.In komplizierteren Szenarien, verwenden Sie einfach die
if
version. Sollten Sie nie fangenNullPointerException
es sei denn, Sie fordern in einem buggy-Bibliothek, die es wirft, in einer Weise, die Sie nicht vermeiden können. Ausnahmen sind nicht vorgesehen für die Verwendung in dieser Art und Weise. Werden Sie verwendet, um zu erkennen, Fehler in der Programmierung und außergewöhnlichen äußeren Bedingungen (wie z.B. IO-Fehler).Ausnahmen sind relativ teuer im Vergleich mit anderen Kontrollfluss-Konstrukte. Aber, nehmen Sie nicht diese zu weit in die andere Richtung: manche Menschen vermeiden Sie Ausnahmen, auch wenn Sie sollte mit Ihnen, durch eine fehlgeleitete Wunsch, zu vermeiden, Ihre Kosten. Wenn verwendet entsprechend, Ausnahmen sollten nicht einen erheblichen Teil Ihrer performance-Profil: wenn Sie feststellen, Sie nehmen eine Menge Zeit, dann ist entweder etwas ist schlecht in Ihrer Umgebung (z.B. du bist ständig versucht, eine Verbindung zu einer Datenbank, auf die Sie keinen Zugriff haben), oder du bist missbrauchen Ausnahmen.
Ich Stimme auf jeden Fall mit dem rest der Antworten. Um nicht zu sagen genau das gleiche, ich will dir nur sagen, dass jetzt bin ich die Einführung zu einem ganz großen kommerziellen source-code, der geschrieben wurde, seit etwa 3 Jahren und ich habe nicht gesehen, jede Anweisung mit der
try-catch
Ansatz, den Sie haben, erwähnt; obwohl es gab viel zu schauen fürnull
😉Verwenden von try-catch-Klausel definitiv nicht besser.
Auch try-catch-Ergebnisse in der Instanziierung des neuen Objekts (die Ausnahme).
Und auch wenn sonst verbessert die Lesbarkeit.
Also ich würde sagen, dass (n!=null) wird schneller in den Fall, Sie haben eine Menge von Fällen, wo n == null.
Auch n!=null ist superfast konstruieren.
Verwenden
if-else
für Situationen, wo Sie können. Werfen und abfangen von Ausnahmen kann teuer werden und sollte verwendet werden, zu behandeln Fehlerfälle (nicht für logische Verzweigungen).Unabhängig von der Leistung, würde ich lieber das if-else form. Angenommen, mServerDevice ist nicht null, aber so etwas geht schlecht während der getName () - Aufruf, und es wirft eine NullPointerException. Die Ausnahme-basierte version wird automatisch null zurück, ohne die Protokollierung der Fehler.