Warum sollten Sie etwas über Null in Java lernen?
Denn wenn Sie nicht auf Null achten, können Sie sicher sein, dass Java Sie auf schreckliche Weise leiden lässtjava.lang.NullPointerException
und Sie Ihre Lektion lernen, aber Sie werden den harten Weg gehen. Absturzsicheren Code zu schreiben ist eine Kunst und Ihr Team, Ihre Kunden und Benutzer werden es zu schätzen wissen. Meiner Erfahrung nach ist einer der Hauptgründe NullPointerException
mangelndes Wissen über Null in Java. Viele von Ihnen sind bereits mit null vertraut, der Rest von Ihnen wird einiges Altes und Neues über das Schlüsselwort null lernen können. Lassen Sie uns einige wichtige Dinge über Null in Java überprüfen oder lernen.
Was ist in Java null?
Wie gesagt, null ist ein sehr, sehr wichtiges Konzept in Java. Es wurde ursprünglich erfunden, um das Fehlen von etwas anzuzeigen, beispielsweise das Fehlen eines Benutzers, einer Ressource oder was auch immer, aber es stellt Java-Programmierer immer wieder vor ein Rätselnull pointer exception
. In diesem Tutorial lernen wir die grundlegenden Fakten über das Schlüsselwort null in Java kennen und lernen einige Tricks kennen, um Probleme mit null pointer exceptions
Nullprüfungen zu vermeiden und diese zu minimieren.
-
Das Wichtigste zuerst: null ist ein Schlüsselwort in Java, genau wie
public
,static
oderfinal
. Die Groß-/Kleinschreibung ist empfindlich, Sie können null nicht als Null oder NULL schreiben, der Compiler erkennt es nicht und es wird ein Fehler ausgegeben.Object obj = NULL; // Not Ok Object obj1 = null //Ok
Dies tritt häufig bei Programmierern auf, die von anderen Programmiersprachen umgestiegen sind, bei der Verwendung moderner IDEs wird das Problem jedoch unbedeutend. Heutzutage können IDEs wie Eclipse oder NetBeans diesen Fehler während der Eingabe beheben, aber im Zeitalter von Notepad, Vim und Emacs war dies ein häufiges Problem, das viel wertvolle Zeit verschlingen konnte.
-
Так же, Wie каждый примитив имеет Bedeutung по умолчанию, например, у
int
это 0, у boolean это false, null это Bedeutung по умолчанию любых ссылочных типов, проще говоря, для всех ein Objektов. Так же, Wie при создании логической переменной ее Bedeutung по умолчанию равно false, так и любые ссылочные переменные в Java по умолчанию будут равны null. Это истинно для всех типов переменных: переменной-члена oder локальной переменной, переменной экземпляра oder статической переменной, кроме того, компилятор будет ругаться, если Вы используете локальную переменную не проинициализировав ее.private static Object myObj; public static void main(String args[]){ System.out.println("What is value of myObjc : " + myObj); } What is value of myObjc : null
Это истинно Wie для статических, так и для не статических ein Objektов, Wie Вы можете видеть здесь, я сделал
myObj
статической ссылкой, так что я могу использовать ее непосредственно в методеmain
, который является статическим методом и не позволяет обращаться к не статическим переменным изнутри. -
Несмотря на распространенное заблуждение, null это не ein Objekt (
Object
) и ни тип. Это просто специальное Bedeutung, которое может быть назначено любому ссылочному типу, и Вы можете привести null к любому типу, Wie показано ниже:String str = null; // null can be assigned to String Integer itr = null; // you can assign null to Integer also Double dbl = null; // null can also be assigned to Double String myStr = (String) null; // null can be type cast to String Integer myItr = (Integer) null; // it can also be type casted to Integer Double myDbl = (Double) null; // yes it's possible, no error
Как Вы можете видеть, приведение null к любому ссылочному типу пройдет успешно Wie во время компиляции, так и во время выполнения программы. В отличии от того, что многие из Вас возможно подумали, это не приведет к выбрасыванию
NullPointerException
. -
null может быть назначен только ссылочному типу, Вы не можете назначить null примитивной переменной вроде
int
,double
,float
oderboolean
. Компилятор выразит Вам свое недовольство если Вы сделаете Wie показано ниже:int i = null; // type mismatch : cannot convert from null to int short s = null; // type mismatch : cannot convert from null to short byte b = null: // type mismatch : cannot convert from null to byte double d = null; //type mismatch : cannot convert from null to double Integer itr = null; // this is ok int j = itr; // this is also ok, but NullPointerException at runtime
Как Вы можете видеть, когда мы непосредственно присваиваем null примитиву, то получаем ошибку процесса компиляции, но, если присвоить null ein Objektу класса-обертки, а затем присвоить этот ein Objekt соответствующему примитивному типу, компилятор не отреагирует, но мы будем вознаграждены
null pointer exception
во время выполнения. Это происходит из-за авто упаковки (autoboxing
) в Java, и мы еще встретимся с ним в следующем пункте. -
Любой класс-обертка со Bedeutungм null будет выбрасывать
java.lang.NullPointerException
когда Java распакует(unbox
) его в примитивную переменную. Некоторые программисты делают ошибку допуская, что авто упаковка(autoboxing
) позаботится о конвертации null в Bedeutung по умолчанию для соответствующего примитивного типа, например, 0 дляint
, false дляboolean
и т.д., но это не верно, в чем можно убедиться ниже:Integer iAmNull = null; int i = iAmNull; // Remember - No Compilation Error
Но, когда Вы запустите данный фрагмент Codeа, в консоли Вы увидите
Exception in thread "main" java.lang.NullPointerException
Это часто происходит при работе с
HashMap
иInteger key
. Выполнение Codeа, показанного ниже прервется, Wie только Вы его запустите.import java.util.HashMap; import java.util.Map; /** * An example of Autoboxing and NullPointerExcpetion * * @author WINDOWS 8 */ public class Test { public static void main(String args[]) throws InterruptedException { Map numberAndCount = new HashMap<>(); int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5}; for(int i : numbers){ int count = numberAndCount.get(i); numberAndCount.put(i, count++); // NullPointerException here } } }
Output: Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:25)
Dieser Code sieht sehr einfach und harmlos aus. Sie zählen einfach, wie oft eine Zahl in einem Array vorkommt, eine klassische Technik zum Auffinden von Duplikaten. Der Entwickler nimmt die zuvor gezählte Menge, erhöht sie um eins und fügt sie wieder ein
Map
.Integer
Er denkt vielleicht, dass Auto-Boxing die Konvertierung in übernimmtint
, so wie es beim Aufruf der Methode der Fall ist , aber er vergisst, dass die Methode null und nicht Null zurückgibtput()
, wenn die Zahl noch nicht gezählt wurde , da dies der Standardwert ist Ist eine Ganzzahl, ist dies null, nicht 0, und Auto-Boxing löst einen Fehler aus, wenn versucht wird, eine Ganzzahl in eine Variable umzuwandeln .get()
HashMap
null pointer exception
int
-
Der Operator
instanceof
gibt false zurück, wenn eine Referenzvariable mit dem Wert null oder null selbst als Parameter angegeben wird. Beispiel:Integer iAmNull = null; if(iAmNull instanceof Integer){ System.out.println("iAmNull is instance of Integer"); }else{ System.out.println("iAmNull is NOT an instance of Integer"); }
Output : iAmNull is NOT an instance of Integer
Dies ist eine wichtige Eigenschaft des Operators
instanceof
, die ihn zum Testen von Typumwandlungen nützlich macht. -
Sie wissen, dass Sie keine nicht statische Methode für eine Null-Referenzvariable aufrufen können, sie wird aufgerufen
NullPointerException
, aber Sie wissen möglicherweise nicht, dass Sie eine statische Methode für eine Null-Referenzvariable aufrufen können. Weil Statische Methoden verwenden statische Bindung, sie werfen nicht wegNullPointerException
. Hier ist ein Beispiel:public class Testing { public static void main(String args[]){ Testing myObject = null; myObject.iAmStaticMethod(); myObject.iAmNonStaticMethod(); } private static void iAmStaticMethod(){ System.out.println("I am static method, can be called by null reference"); } private void iAmNonStaticMethod(){ System.out.println("I am NON static method, don't date to call me by null"); } }
Output: I am static method, can be called by null reference Exception in thread "main" java.lang.NullPointerException at Testing.main(Testing.java:11)
-
Sie können null als Parameter an eine Methode übergeben, die jeden Referenztyp akzeptiert, zum Beispiel:
public void print(Object obj)
kann so genannt werden
print(null)
Aus Sicht des Compilers ist dies normal, das weitere Verhalten hängt jedoch vollständig von der Methode ab. Eine nullsichere Methode löst keine aus
NullPointerException
, sondern wird einfach ordnungsgemäß beendet. Wenn die Geschäftslogik dies zulässt, wird empfohlen, nullsichere Methoden zu schreiben. -
Sie können Null mit den Operatoren
==
(gleich) und!=
(ungleich) vergleichen, aber Sie können es nicht mit anderen arithmetischen oder logischen Operatoren wie<
(kleiner als) oder>
(größer als) verwenden. Im Gegensatz zu SQLnull == null
gibt Java wie unten gezeigt true zurück:public class Test { public static void main(String args[]) throws InterruptedException { String abc = null; String cde = null; if(abc == cde){ System.out.println("null == null is true in Java"); } if(null != null){ System.out.println("null != null is false in Java"); } // classical null check if(abc == null){ // do something } // not ok, compile time error if(abc > null){ } } }
Output: null == null is true in Java
NullPointerException
, können Sie Ihren Code sicher machen. Weil null kann als leerer oder nicht initialisierter Wert behandelt werden. Dies führt häufig zu Verwirrung. Deshalb ist es wichtig, das Verhalten einer Methode zu dokumentieren, wenn ein Nullwert eingegeben wird. Denken Sie immer daran, dass Null der Standardwert von Referenzvariablen ist und Sie in Java keine Instanzmethoden aufrufen oder auf Instanzvariablen zugreifen können, indem Sie eine Nullreferenz verwenden.
GO TO FULL VERSION