Für Java-Programmierer bereitet Null Kopfschmerzen. Sie werden oft von Null Pointer Exceptions (NPE) belästigt. Sogar der Erfinder von Java gab zu, dass dies ein großer Fehler seinerseits war. Warum bleibt Java null? Die Null gibt es schon seit einiger Zeit, und ich denke, die Java-Erfinder wussten, dass die Null mehr Ärger verursachte als die Probleme, die sie löste, aber die Null gibt es immer noch in Java.
Ich bin immer mehr überrascht, denn das Designprinzip von Java besteht darin, Dinge zu vereinfachen, weshalb keine Zeit mit Zeigern und Operatorüberladung verschwendet wird und die Implementierung von Mehrfachvererbung Null ist. Nun, ich kenne die Antwort auf diese Frage nicht wirklich. Was ich weiß, ist, dass wir mit Null koexistieren müssen, egal wie sehr Null von Java-Entwicklern und der Open-Source-Community kritisiert wird. Anstatt die Existenz von Null zu bereuen, sollten wir uns besser mit Null vertraut machen und sicherstellen, dass Null korrekt verwendet wird.
Warum müssen Sie Null in Java lernen? Denn wenn Sie nicht auf Null achten, werden Sie in Java unter NullPointerException leiden und eine schmerzhafte Lektion lernen. Energetisches Programmieren ist eine Kunst, die Ihr Team, Ihre Kunden und Benutzer mehr schätzen werden. Meiner Erfahrung nach ist einer der Hauptgründe für Nullzeigerausnahmen unzureichende Kenntnisse von Null in Java. Viele von Ihnen sind bereits mit Null vertraut, aber diejenigen, die es noch nicht kennen, können etwas Altes und Neues über Null lernen. Lassen Sie uns einige wichtige Kenntnisse über Null in Java noch einmal erlernen.
Was ist Null in Java?
Wie gesagt, null ist ein sehr wichtiges Konzept in Java. Die ursprüngliche Absicht von null besteht darin, etwas Fehlendes darzustellen, beispielsweise einen fehlenden Benutzer, eine fehlende Ressource oder andere Dinge. Ein Jahr später sorgte die problematische Nullzeiger-Ausnahme jedoch für große Belästigung bei Java-Programmierern. In diesem Material lernen wir die grundlegenden Details des Null-Schlüsselworts in Java kennen und erkunden einige Techniken zur Minimierung von Null-Prüfungen und zur Vermeidung böser Null-Zeiger-Ausnahmen.
1) Zunächst einmal ist null ein Schlüsselwort in Java, wie public, static und final. Dabei wird die Groß-/Kleinschreibung beachtet, Sie können null nicht als Null oder NULL schreiben, der Compiler erkennt sie nicht und meldet einen Fehler.
Kopieren Sie den Codecode wie folgt:
Objekt obj = NULL; // Nicht ok
Objekt obj1 = null //Ok
Programmierer, die andere Sprachen verwenden, haben möglicherweise dieses Problem, aber jetzt hat die Verwendung von IDE dieses Problem trivial gemacht. Wenn Sie jetzt Code eingeben, können IDEs wie Eclipse und Netbeans diesen Fehler korrigieren. Aber wenn Sie andere Tools wie Notepad, Vim und Emacs verwenden, wird dieses Problem Ihre kostbare Zeit verschwenden.
2) So wie jeder primitive Typ einen Standardwert hat, ist beispielsweise der Standardwert von int 0, der Standardwert von boolean ist false und null ist der Standardwert jedes Referenztyps. Streng genommen ist es der Standardwert aller Objekttypen. So wie Sie eine boolesche Variable erstellen, deren Standardwert „false“ ist, hat jede Referenzvariable in Java den Standardwert „null“. Dies gilt für alle Variablen, wie z. B. Mitgliedsvariablen, lokale Variablen, Instanzvariablen und statische Variablen (wenn Sie jedoch eine nicht initialisierte lokale Variable verwenden, werden Sie vom Compiler gewarnt). Um diese Tatsache zu demonstrieren, können Sie diese Referenzvariable beobachten, indem Sie eine Variable erstellen und dann ihren Wert ausgeben, wie im folgenden Code gezeigt:
Kopieren Sie den Codecode wie folgt:
privates statisches Objekt myObj;
public static void main(String args[]){
System.out.println("Was ist der Wert von myObjc: " + myObj);
}
Was ist der Wert von myObjc: null?
Dies gilt sowohl für statische als auch für nicht statische Objekte. Wie Sie hier sehen können, habe ich myObj als statische Referenz definiert, damit ich sie direkt in der Hauptmethode verwenden kann. Beachten Sie, dass die Hauptmethode eine statische Methode ist und keine nicht statischen Variablen verwenden kann.
3) Wir möchten einige Missverständnisse klären. Es handelt sich lediglich um einen speziellen Wert. Sie können Null auch in einen beliebigen Typ umwandeln.
Kopieren Sie den Codecode wie folgt:
String str = null; // null kann String zugewiesen werden
Integer itr = null; // Sie können auch Integer null zuweisen
Double dbl = null; // null kann auch Double zugewiesen werden
String myStr = (String) null; // null kann in String umgewandelt werden
Integer myItr = (Integer) null; // es kann auch in den Typ Integer umgewandelt werden
Double myDbl = (Double) null; // Ja, es ist möglich, kein Fehler
Sie können sehen, dass die Umwandlung von Null in einen beliebigen Referenztyp zur Kompilierungs- und Laufzeit möglich ist und zur Laufzeit keine Nullzeigerausnahme auslöst.
4) Null kann Referenzvariablen zugewiesen werden, Sie können jedoch Basistypvariablen wie int, double, float und boolean nicht null zuweisen. Wenn Sie das tun, gibt der Compiler einen Fehler wie diesen aus:
Kopieren Sie den Codecode wie folgt:
int i = null; // Typkonflikt: Konvertierung von null nach int nicht möglich
short s = null; // Typkonflikt: Konvertierung von null nach short nicht möglich
byte b = null: // Typkonflikt: Konvertierung von Null in Byte nicht möglich
double d = null; //Typkonflikt: Kann nicht von null in double konvertiert werden
Ganzzahl itr = null; // das ist ok
int j = itr; // das ist auch ok, aber NullPointerException zur Laufzeit
Wie Sie sehen, tritt ein Kompilierungsfehler auf, wenn Sie null direkt einem primitiven Typ zuweisen. Wenn Sie jedoch dem Wrapper-Klassenobjekt null zuweisen und dann das Objekt den jeweiligen Basistypen zuweisen, meldet der Compiler dies nicht, aber Sie werden zur Laufzeit auf eine Nullzeigerausnahme stoßen. Dies wird durch das automatische Unboxing in Java verursacht, was wir im nächsten Aufzählungspunkt sehen werden.
5) Jede Wrapper-Klasse, die einen Nullwert enthält, löst eine Nullzeiger-Ausnahme aus, wenn Java grundlegende Datentypen entpackt und generiert. Einige Programmierer machen den Fehler zu glauben, dass Autoboxing null in den Standardwert des jeweiligen Basistyps umwandelt, z. B. 0 für int und false für booleschen Typ, aber das ist nicht korrekt, wie unten gezeigt:
Kopieren Sie den Codecode wie folgt:
Ganzzahl iAmNull = null;
int i = iAmNull; // Merken – Kein Kompilierungsfehler
Wenn Sie jedoch den obigen Codeausschnitt ausführen, sehen Sie auf der Konsole, dass der Hauptthread eine Nullzeigerausnahme auslöst. Viele dieser Fehler treten bei der Verwendung von HashMap- und Integer-Schlüsselwerten auf. Wenn Sie den folgenden Code ausführen, wird ein Fehler angezeigt.
Kopieren Sie den Codecode wie folgt:
import java.util.HashMap;
java.util.Map importieren;
/**
* Ein Beispiel für Autoboxing und NullPointerExcpetion
*
* @author WINDOWS 8
*/
öffentlicher Klassentest {
public static void main(String args[]) löst InterruptedException {
Map numberAndCount = new HashMap<>();
int[] Zahlen = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
for(int i : Zahlen){
int count = numberAndCount.get(i);
numberAndCount.put(i, count++); // NullPointerException hier
}
}
}
Ausgabe:
Kopieren Sie den Codecode wie folgt:
Ausnahme im Thread „main“ java.lang.NullPointerException
bei Test.main(Test.java:25)
Dieser Code sieht sehr einfach und fehlerfrei aus. Sie müssen lediglich herausfinden, wie oft eine Zahl in einem Array vorkommt. Dies ist die typische Technik zum Auffinden von Duplikaten in Java-Arrays. Der Entwickler ruft zunächst den vorherigen Wert ab, fügt dann einen hinzu und fügt den Wert schließlich wieder in die Map ein. Der Programmierer denkt vielleicht, dass beim Aufrufen der Put-Methode das automatische Boxen das Boxen von int in Interger übernimmt, aber er vergisst, dass die get()-Methode von HashMap null und nicht 0 zurückgibt, wenn eine Zahl keinen Zählwert hat , da der Standardwert von Integer null und nicht 0 ist. Autoboxing gibt eine NullPointerException zurück, wenn ein Nullwert an eine int-Variable übergeben wird. Stellen Sie sich vor, dieser Code befände sich in einem if-Nest und würde nicht in einer QA-Umgebung ausgeführt, aber sobald Sie ihn in eine Produktionsumgebung stellen, BOOM :-)
6) Wenn eine Referenztypvariable mit einem Nullwert verwendet wird, gibt die Instanz der Operation „false“ zurück:
Kopieren Sie den Codecode wie folgt:
Ganzzahl iAmNull = null;
if(iAmNull Instanz von Integer){
System.out.println("iAmNull ist eine Instanz von Integer");
}anders{
System.out.println("iAmNull ist KEINE Instanz von Integer");
}
Ausgabe:
Kopieren Sie den Codecode wie folgt:
ich
AmNull ist KEINE Instanz von Integer
Dies ist eine sehr wichtige Funktion der Instanzoperation, die sie für Typumwandlungsprüfungen nützlich macht.
7) Möglicherweise wissen Sie, dass Sie keine nicht statische Methode aufrufen können, um eine Referenztypvariable mit einem Nullwert zu verwenden. Es wird eine Nullzeigerausnahme ausgelöst, aber Sie wissen möglicherweise nicht, dass Sie statische Methoden verwenden können, um eine Referenztypvariable mit dem Wert Null zu verwenden. Da statische Methoden eine statische Bindung verwenden, werden keine Nullzeigerausnahmen ausgelöst. Hier ist ein Beispiel:
Kopieren Sie den Codecode wie folgt:
öffentliche Klassentests {
public static void main(String args[]){
Testen myObject = null;
myObject.iAmStaticMethod();
myObject.iAmNonStaticMethod();
}
private static void iAmStaticMethod(){
System.out.println("Ich bin eine statische Methode, kann durch Nullreferenz aufgerufen werden");
}
private void iAmNonStaticMethod(){
System.out.println("Ich bin KEINE statische Methode, rufen Sie mich nicht bei Null an");
}
Ausgabe:
Kopieren Sie den Codecode wie folgt:
Ich bin eine statische Methode, die per Nullreferenz aufgerufen werden kann
Ausnahme im Thread „main“ java.lang.NullPointerException
bei Testing.main(Testing.java:11)
8) Sie können der Methode null übergeben und die Methode kann beispielsweise jeden Referenztyp empfangen. public void print(Object obj) kann print(null) wie folgt aufrufen. Aus Kompilierungssicht ist das in Ordnung, das Ergebnis hängt jedoch vollständig von der Methode ab. Nullsichere Methoden, wie etwa die print-Methode in diesem Beispiel, lösen keine NullPointerException aus und werden einfach ordnungsgemäß beendet. Wenn die Geschäftslogik dies zulässt, wird empfohlen, nullsichere Methoden zu verwenden.
9) Sie können ==- oder !=-Operationen verwenden, um Nullwerte zu vergleichen, aber Sie können keine anderen Algorithmen oder logischen Operationen verwenden, wie z. B. kleiner als oder größer als. Im Gegensatz zu SQL gibt null==null in Java true zurück, wie unten gezeigt:
Kopieren Sie den Codecode wie folgt:
öffentlicher Klassentest {
public static void main(String args[]) löst InterruptedException {
Zeichenfolge abc = null;
String cde = null;
if(abc == cde){
System.out.println("null == null ist wahr in Java");
}
if(null != null){
System.out.println("null != null ist in Java falsch");
}
// klassische Nullprüfung
if(abc==null){
// etwas tun
}
// nicht ok, Kompilierzeitfehler
if(abc > null){
}
}
}
Ausgabe:
Kopieren Sie den Codecode wie folgt:
null == null ist in Java wahr
Hier dreht sich alles um null in Java. Mit etwas Erfahrung in der Java-Programmierung und der Verwendung einfacher Tricks zur Vermeidung von Nullzeigerausnahmen können Sie Ihren Code nullsicher machen. Da Null häufig als leerer oder nicht initialisierter Wert verwendet wird, kann dies zu Verwirrung führen. Bei Methoden ist es außerdem sehr wichtig, aufzuzeichnen, wie sich die Methode verhält, wenn null als Parameter verwendet wird. Denken Sie im Großen und Ganzen daran, dass null der Standardwert einer Referenztypvariable ist. Sie können keine Nullreferenzen verwenden, um Instanzmethoden oder Instanzvariablen in Java aufzurufen.