Warum sollten Sie keine Ausnahmen verwenden, um Ihren Ablauf in Java zu steuern?

Java ist eine universelle Programmiersprache, die viele alternative Lösungen für Ihre spezifischen Aufgaben bietet. Dennoch gibt es gute Ansätze, die befolgt werden sollten, und es gibt auch einige erfolglose Ansätze, die wir größtenteils noch verwenden.

Einer der häufigsten fehlgeschlagenen Ansätze ist die Verwendung von Ausnahmen zur Steuerung des Ausführungsflusses. Dies sollte aus zwei Gründen vermieden werden:

  1. Dies verringert die Leistung und Geschwindigkeit Ihres Codes.
  2. Dies macht Ihren Code weniger lesbar.

Beginnen wir mit einem Beispiel. Hier wird die Ausnahme verwendet, um den Ausführungsfluss zu steuern:

public static int findAge(String name) { try { String ageAsString = findUser(name); return ageAsString.length(); } catch (NameNotFoundException e) { return 0; } } private static String findUser(String name) { if(name==null) { throw new NameNotFoundException(); } return name; } 

Wenn der Benutzer einen Wert ungleich Null für den Namen angibt, gibt die findAge-Methode die Länge dieses Namens zurück. Wenn der Benutzername jedoch null ist, gibt die findUser-Methode eine NameNotFoundException-Ausnahme aus, und in diesem Fall gibt die findAge-Methode 0 zurück.

Wie können wir diesen Code ohne Ausnahmen konvertieren? Im Allgemeinen gibt es viele Möglichkeiten, eine davon in Betracht zu ziehen:

 public static int findAgeNoEx(String name) { String ageAsString = findUserNoEx(name); return ageAsString.length(); } private static String findUserNoEx(String name) { if(name==null) { return ""; } return name; } 

Um die Auswirkung der Ausnahme auf die Leistung herauszufinden, habe ich den folgenden Code vorbereitet, der beide Varianten der Methoden 10 Millionen Mal aufruft: mit und ohne Ausnahme.

 public class ControlFlowWithExceptionOrNot { public static class NameNotFoundException extends RuntimeException { private static final long serialVersionUID = 3L; } private static final int TRIAL = 10000000; public static void main(String[] args) throws InterruptedException { long start = System.currentTimeMillis(); for (int i = 0; i < TRIAL; i++) { findAgeNoEx(null); } System.out.println("Duration :" + (System.currentTimeMillis() - start)); long start2 = System.currentTimeMillis(); for (int i = 0; i < TRIAL; i++) { findAge(null); } System.out.println("Duration :" + (System.currentTimeMillis() - start2)); }; public static int findAge(String name) { try { String ageAsString = findUser(name); return ageAsString.length(); } catch (NameNotFoundException e) { return 0; } } private static String findUser(String name) { if (name == null) { throw new NameNotFoundException(); } return name; } public static int findAgeNoEx(String name) { String ageAsString = findUserNoEx(name); return ageAsString.length(); } private static String findUserNoEx(String name) { if (name == null) { return ""; } return name; } } 

Fazit:

 Duration :16 Duration :6212 

Wie Sie sehen, hat uns die Verwendung der Ausnahme auf meinem Intel Core i7-3630QM Tausende von Millisekunden gekostet.

Wenn wir unsere beiden findAge-Methoden in Bezug auf die Lesbarkeit vergleichen, ist die Methode ausnahmslos klar: Erstens können wir absolut sicher sein, dass die findUser-Methode einen String zurückgibt. und zweitens, unabhängig davon, welcher String zurückgegeben wird, erhalten wir seine Länge. Gleichzeitig ist die Methode mit der Ausnahme etwas verwirrend: Es ist nicht ganz klar, was genau die findUser-Methode zurückgibt. Es kann eine Zeichenfolge zurückgeben oder eine Ausnahme auslösen, die in der Methodensignatur nicht sichtbar ist. Aus diesem Grund begrüßt das Paradigma der funktionalen Programmierung die Verwendung von Ausnahmen nicht.

Am Ende ist es besser, wenn Sie Ausnahmen verwenden, bei denen die Ausnahme tatsächlich auftritt und erforderlich ist. Wenn Sie Ausnahmen verwenden, um den Ausführungsfluss zu steuern, wird dadurch die Programmleistung beeinträchtigt und der Code wird weniger lesbar.

Ich hoffe, dieser Artikel war für Sie interessant und möglicherweise nützlich.

Source: https://habr.com/ru/post/de476142/


All Articles