Verwendung von bedingten Prüfungen zur Verhinderung der Division durch Null
Anstatt Ausnahmen zu behandeln, nachdem sie aufgetreten sind, können wir verhindern, dass sie überhaupt erst entstehen, indem wir bedingte Prüfungen verwenden. Dieser Ansatz wird oft als effizienter angesehen, da Ausnahmebehandlungsmechanismen Ihrem Programm einen Mehraufwand hinzufügen können.
Lassen Sie uns ein Programm erstellen, das bedingte Prüfungen verwendet, um die Division durch Null zu vermeiden:
-
Erstellen Sie in der WebIDE eine neue Datei namens ConditionalCheckDemo.java.
-
Kopieren Sie den folgenden Code in die Datei:
public class ConditionalCheckDemo {
public static void main(String[] args) {
System.out.println("Starting the conditional check demonstration");
int numerator = 10;
int[] denominators = {5, 0, 2, 0, 4};
for (int denominator : denominators) {
int result = divideWithCheck(numerator, denominator);
System.out.println("Result of " + numerator + " / " + denominator + " = " + result);
}
System.out.println("Program completed successfully");
}
public static int divideWithCheck(int numerator, int denominator) {
// Check if denominator is zero before performing division
if (denominator == 0) {
System.out.println("Warning: Cannot divide by zero, returning -1 as a default value");
return -1;
} else {
return numerator / denominator;
}
}
}
- Öffnen Sie ein Terminal und kompilieren Sie das Java-Programm:
javac ConditionalCheckDemo.java
- Führen Sie das kompilierte Programm aus:
java ConditionalCheckDemo
Sie sollten eine Ausgabe ähnlich dieser sehen:
Starting the conditional check demonstration
Result of 10 / 5 = 2
Warning: Cannot divide by zero, returning -1 as a default value
Result of 10 / 0 = -1
Result of 10 / 2 = 5
Warning: Cannot divide by zero, returning -1 as a default value
Result of 10 / 0 = -1
Result of 10 / 4 = 2
Program completed successfully
In diesem Beispiel prüfen wir, ob der Nenner Null ist, bevor wir die Division durchführen. Wenn er Null ist, geben wir einen Standardwert (-1) zurück und zeigen eine Warnmeldung an. Dieser Ansatz verhindert, dass die ArithmeticException überhaupt erst ausgelöst wird.
Vergleichen wir die beiden Ansätze:
| Try-Catch-Ansatz |
Bedingter Prüfungsansatz |
| Behandelt Ausnahmen, nachdem sie aufgetreten sind |
Verhindert das Auftreten von Ausnahmen |
| Nützlich, wenn Ausnahmen selten sind |
Nützlich, wenn potenzielle Ausnahmen vorhergesagt werden können |
| Kann einen etwas höheren Performance-Overhead haben |
Im Allgemeinen effizienter |
| Kann mehrere Ausnahmetypen behandeln |
Behandelt nur bestimmte Bedingungen, die Sie prüfen |
Beide Ansätze sind gültig, und die Wahl zwischen ihnen hängt von Ihren spezifischen Anforderungen ab:
-
Verwenden Sie bedingte Prüfungen, wenn:
- Sie Fehlerbedingungen leicht vorhersagen und prüfen können
- Die Performance kritisch ist
- Die Bedingung häufig erwartet wird
-
Verwenden Sie Try-Catch-Blöcke, wenn:
- Die Prüfung der Bedingung den Code komplexer machen würde
- Die Fehlerbedingung selten ist
- Sie mehrere Arten von Ausnahmen behandeln müssen
- Die Fehlerbedingung an verschiedenen Stellen in Ihrem Code auftreten kann
Lassen Sie uns nun beide Ansätze kombinieren, um eine robustere Lösung zu erstellen:
-
Erstellen Sie eine neue Datei namens CombinedApproachDemo.java.
-
Kopieren Sie den folgenden Code in die Datei:
public class CombinedApproachDemo {
public static void main(String[] args) {
System.out.println("Starting the combined approach demonstration");
int numerator = 10;
int[] denominators = {5, 0, 2, 0, 4};
for (int denominator : denominators) {
int result = divideWithCombinedApproach(numerator, denominator);
System.out.println("Result of " + numerator + " / " + denominator + " = " + result);
System.out.println("---------------");
}
System.out.println("Program completed successfully");
}
public static int divideWithCombinedApproach(int numerator, int denominator) {
// First approach: Check if denominator is zero
if (denominator == 0) {
System.out.println("Warning: Cannot divide by zero, returning -1 as a default value");
return -1;
}
// Second approach: Use try-catch as an additional safety net
try {
return numerator / denominator;
} catch (ArithmeticException e) {
// This should not happen if our conditional check is correct
// But it provides an extra layer of protection
System.out.println("Unexpected error occurred: " + e.getMessage());
return -999; // A different default value to distinguish from the conditional check
}
}
}
- Kompilieren und führen Sie das Programm aus:
javac CombinedApproachDemo.java
java CombinedApproachDemo
Sie sollten eine Ausgabe ähnlich dieser sehen:
Starting the combined approach demonstration
Result of 10 / 5 = 2
---------------
Warning: Cannot divide by zero, returning -1 as a default value
Result of 10 / 0 = -1
---------------
Result of 10 / 2 = 5
---------------
Warning: Cannot divide by zero, returning -1 as a default value
Result of 10 / 0 = -1
---------------
Result of 10 / 4 = 2
---------------
Program completed successfully
Dieser kombinierte Ansatz bietet das Beste aus beiden Welten. Er verwendet eine bedingte Prüfung, um die Ausnahme in häufigen Fällen zu vermeiden, und enthält auch einen Try-Catch-Block als Sicherheitsnetz, um unerwartete Probleme abzufangen.
In realen Anwendungen hilft dieser defensive Programmierstil, robustere Software zu erstellen, die Fehler problemlos behandeln und auch dann weiterarbeiten kann, wenn unerwartete Situationen auftreten.