Einführung
In diesem Lab werden wir untersuchen, wie man potenzielle null-Werte behandelt, wenn man mit Java's Character-Wrapperklasse arbeitet. Im Gegensatz zum primitiven char-Typ kann das Character-Objekt null sein, und wenn man dies nicht behandelt, kann dies zu NullPointerException-Fehlern führen. Wir werden lernen, wie man prüft, ob ein Character-Objekt null ist, Null-Prüfungen mit anderen Zeichen-Eigenschaftsprüfungen kombiniert und die Optional-Klasse für eine sicherere Null-Behandlung nutzt.
Durch praktische Beispiele werden Sie praktische Erfahrungen beim Schreiben robuster Java-Code sammeln, der effektiv null-Character-Objekte verwaltet, häufige Laufzeitfehler verhindert und die Zuverlässigkeit Ihrer Anwendungen verbessert.
Prüfen Sie den Character-Wrapper auf Null
In diesem Schritt werden wir untersuchen, wie man potenzielle null-Werte behandelt, wenn man mit Java's Character-Wrapperklasse arbeitet. Während primitive char-Typen nicht null sein können, kann die Character-Wrapperklasse als Objekt null sein. Die Behandlung von null-Werten ist entscheidend, um NullPointerException-Fehler zu vermeiden, die in Java häufig auftreten und Ihr Programm zum Absturz bringen können.
Wir beginnen mit der Erstellung eines einfachen Java-Programms, das zeigt, wie eine NullPointerException auftreten kann, wenn Sie versuchen, eine Methode auf einem Character-Objekt aufzurufen, das null ist.
Öffnen Sie die Datei
HelloJava.javaim WebIDE-Editor, wenn sie noch nicht geöffnet ist.Ersetzen Sie den gesamten Inhalt der Datei durch folgenden Code:
public class HelloJava { public static void main(String[] args) { Character myChar = null; // Diese Zeile verursacht eine NullPointerException, wenn myChar null ist // System.out.println("Is myChar a letter? " + Character.isLetter(myChar)); } }In diesem Code:
- Wir deklarieren eine
Character-Variable namensmyCharund setzen sie explizit aufnull. - Die auskommentierte Zeile
System.out.println("Is myChar a letter? " + Character.isLetter(myChar));versucht, die statische MethodeCharacter.isLetter()mit einemnull-Argument aufzurufen. ObwohlCharacter.isLetter()eine statische Methode ist, führt das Übergeben einesnull-Character-Objekts immer noch zu einerNullPointerException, da die Methode intern versucht, dasCharacter-Objekt in seinen primitivenchar-Wert zu entpacken, was fürnullnicht möglich ist.
- Wir deklarieren eine
Speichern Sie die Datei (Strg+S oder Cmd+S).
Jetzt lassen wir das Programm kompilieren. Öffnen Sie das Terminal am unteren Rand des WebIDE und führen Sie aus:
javac HelloJava.javaWenn die Kompilierung erfolgreich ist, sollten Sie keine Ausgabe sehen.
Jetzt versuchen wir, das Programm auszuführen. Im Terminal führen Sie aus:
java HelloJavaDa die Zeile, die den Fehler verursachen würde, auskommentiert ist, wird das Programm ohne Ausgabe oder Fehler ausgeführt. Dies zeigt, dass das einfache Deklarieren eines
Characteralsnullkeine sofortige Probleme verursacht; das Problem tritt auf, wenn Sie versuchen, Operationen darauf auszuführen.
Im nächsten Schritt werden wir die problematische Zeile einkommentieren und die NullPointerException beobachten.
Kombinieren Sie Null- und Buchstabenprüfungen
Im vorherigen Schritt haben wir gesehen, wie eine NullPointerException auftreten kann, wenn man mit Character-Objekten arbeitet. Jetzt lassen wir die Zeile, die den Fehler verursacht, einkommentieren und sehen die Ausnahme in Aktion. Dann lernen wir eine gängige Methode, um dies zu verhindern, indem wir eine Null-Prüfung mit der Buchstabenprüfung kombinieren.
Öffnen Sie die Datei
HelloJava.javaim WebIDE-Editor.Entfernen Sie die Kommentierung der Zeile, die
Character.isLetter()aufruft. Ihr Code sollte jetzt so aussehen:public class HelloJava { public static void main(String[] args) { Character myChar = null; // Diese Zeile verursacht eine NullPointerException, wenn myChar null ist System.out.println("Is myChar a letter? " + Character.isLetter(myChar)); } }Speichern Sie die Datei (Strg+S oder Cmd+S).
Kompilieren Sie das geänderte Programm im Terminal:
javac HelloJava.javaWieder sollten Sie keine Ausgabe sehen, wenn die Kompilierung erfolgreich ist.
Jetzt führen Sie das Programm aus:
java HelloJavaSie sollten eine Ausgabe ähnlich der folgenden sehen, die auf eine
NullPointerExceptionhinweist:Exception in thread "main" java.lang.NullPointerException at java.base/java.lang.Character.isLetter(Character.java:xxxx) at HelloJava.main(HelloJava.java:x)Dieser Fehler tritt auf, weil
myCharnullist und die MethodeCharacter.isLetter()nicht auf einnull-Objekt angewendet werden kann.Um diese
NullPointerExceptionzu verhindern, können wir eine Prüfung hinzufügen, um zu sehen, obmyCharnullist, bevor wir versuchen,Character.isLetter()aufzurufen. Wir können dafür eineif-Anweisung verwenden. Ändern Sie IhreHelloJava.java-Datei, um diese Prüfung einzubeziehen:public class HelloJava { public static void main(String[] args) { Character myChar = null; if (myChar != null && Character.isLetter(myChar)) { System.out.println("myChar is a letter."); } else { System.out.println("myChar is not a letter or is null."); } } }In diesem aktualisierten Code:
- Wir verwenden eine
if-Anweisung mit zwei Bedingungen, die durch&&(den logischen UND-Operator) kombiniert sind. - Die erste Bedingung,
myChar != null, prüft, obmyCharnichtnullist. - Die zweite Bedingung,
Character.isLetter(myChar), prüft, obmyCharein Buchstabe ist. - Der
&&-Operator ist "kurzschlussfähig". Das bedeutet, dass wenn die erste Bedingung (myChar != null) falsch ist, die zweite Bedingung (Character.isLetter(myChar)) nicht ausgewertet wird. Dies verhindert dieNullPointerException, weil wir nur versuchen,Character.isLetter()aufzurufen, wennmyCharnichtnullist.
- Wir verwenden eine
Speichern Sie die Datei.
Kompilieren Sie das Programm erneut:
javac HelloJava.javaFühren Sie das Programm aus:
java HelloJavaDiesmal sollte das Programm ohne Fehler laufen und ausgeben:
myChar is not a letter or is null.Dies liegt daran, dass
myCharnullist, also ist die erste Bedingung in derif-Anweisung (myChar != null) falsch, und derelse-Block wird ausgeführt.
Dieser Ansatz, auf null zu prüfen, bevor man auf die Methoden oder Eigenschaften eines Objekts zugreift, ist eine grundlegende Technik in Java, um NullPointerExceptions zu vermeiden.
Verwenden Sie Optional für Null-Sicherheit
Im vorherigen Schritt haben wir gelernt, wie man NullPointerException verhindern kann, indem man explizit prüft, ob ein Objekt null ist, bevor man es verwendet. Obwohl dies effektiv ist, kann es manchmal zu Code führen, der mit Null-Prüfungen überfüllt ist. Java 8 hat die Optional-Klasse eingeführt, um potenziell null-Werte auf eine funktionalere und ausdrucksstärkere Weise zu behandeln.
Optional ist ein Containerobjekt, das einen nicht-null-Wert enthalten kann oder auch nicht. Wenn ein Wert vorhanden ist, gibt isPresent() true zurück und get() gibt den Wert zurück. Wenn kein Wert vorhanden ist, wird das Objekt als leer angesehen und isPresent() gibt false zurück. Das Aufrufen von get() auf einem leeren Optional löst eine NoSuchElementException aus.
Lassen Sie uns unser Beispiel umgestalten, um Optional<Character> zu verwenden, um die Möglichkeit eines null-Character zu behandeln.
Öffnen Sie die Datei
HelloJava.javaim WebIDE-Editor.Ersetzen Sie den gesamten Inhalt der Datei durch folgenden Code:
import java.util.Optional; public class HelloJava { public static void main(String[] args) { Character myChar = null; // Noch immer potenziell null // Erstellen Sie ein Optional aus dem potenziell null Character Optional<Character> optionalChar = Optional.ofNullable(myChar); // Verwenden Sie Optional-Methoden, um den Wert zu prüfen und zu verarbeiten if (optionalChar.isPresent() && Character.isLetter(optionalChar.get())) { System.out.println("myChar is a letter."); } else { System.out.println("myChar is not a letter or is null."); } // Eine andere Möglichkeit unter Verwendung von Optional's funktionalen Methoden (fortgeschrittener) // optionalChar.filter(Character::isLetter) // .ifPresentOrElse( // c -> System.out.println("myChar is a letter (using Optional methods)."), // () -> System.out.println("myChar is not a letter or is null (using Optional methods).") // ); } }In diesem Code:
- Wir importieren die
Optional-Klasse. - Wir deklarieren immer noch
myCharals potenziellnull. Optional<Character> optionalChar = Optional.ofNullable(myChar);erstellt einOptional-Objekt.Optional.ofNullable()wird verwendet, wenn der Wertnullsein könnte. WennmyCharnullist, wirdoptionalCharein leeresOptionalsein. WennmyChareinen Wert hat, wirdoptionalChardiesen Wert enthalten.- Wir verwenden dann
optionalChar.isPresent(), um zu prüfen, ob dasOptionaleinen Wert enthält, bevor wir versuchen, ihn mitoptionalChar.get()zu erhalten und ihn anCharacter.isLetter()zu übergeben. Dies ist ähnlich wie unsere vorherige Null-Prüfung, verwendet jedoch dieOptional-API. - Der auskommentierte Abschnitt zeigt eine fortgeschrittenere Möglichkeit,
Optionalmit funktionalen Methoden wiefilterundifPresentOrElsezu verwenden, was den Code für bestimmte Szenarien kompakter machen kann. Wir werden uns in diesem Einführungslabor nicht auf diese fortgeschrittene Verwendung konzentrieren, aber es ist gut, sich dessen bewusst zu sein.
- Wir importieren die
Speichern Sie die Datei.
Kompilieren Sie das Programm:
javac HelloJava.javaFühren Sie das Programm aus:
java HelloJavaDie Ausgabe sollte die gleiche wie im vorherigen Schritt sein:
myChar is not a letter or is null.Dies bestätigt, dass die Verwendung von
Optional.ofNullable()undisPresent()den Null-Fall korrekt behandelt.
Jetzt ändern wir myChar in ein nicht-null-Zeichen, um zu sehen, wie das Programm verhält.
Ändern Sie die
HelloJava.java-Datei, ummyCharauf ein Zeichen, zum Beispiel 'A', zu setzen:import java.util.Optional; public class HelloJava { public static void main(String[] args) { Character myChar = 'A'; // Jetzt hat myChar einen Wert // Erstellen Sie ein Optional aus dem potenziell null Character Optional<Character> optionalChar = Optional.ofNullable(myChar); // Verwenden Sie Optional-Methoden, um den Wert zu prüfen und zu verarbeiten if (optionalChar.isPresent() && Character.isLetter(optionalChar.get())) { System.out.println("myChar is a letter."); } else { System.out.println("myChar is not a letter or is null."); } } }Speichern Sie die Datei.
Kompilieren Sie das Programm:
javac HelloJava.javaFühren Sie das Programm aus:
java HelloJavaDiesmal sollte die Ausgabe sein:
myChar is a letter.Dies zeigt, dass wenn
myChareinen Wert hat,optionalChar.isPresent()truezurückgibt und dieCharacter.isLetter()-Prüfung korrekt durchgeführt wird.
Die Verwendung von Optional kann Ihren Code lesbarer machen und deutlich anzeigen, wann ein Wert fehlen kann, wodurch die Wahrscheinlichkeit unerwarteter NullPointerExceptions verringert wird.
Zusammenfassung
In diesem Lab haben wir gelernt, wie man potenzielle null-Werte behandelt, wenn man mit der Character-Wrapper-Klasse in Java arbeitet. Wir haben begonnen, indem wir gezeigt haben, wie eine NullPointerException auftreten kann, wenn man versucht, eine Methode auf einem null-Character-Objekt anzuwenden, selbst bei statischen Methoden wie Character.isLetter(). Dies hat die Wichtigkeit einer expliziten Prüfung auf null vor der Ausführung von Operationen auf Character-Objekten hervorgehoben, um Programmabstürze zu vermeiden.



