Чаро шумо бояд дар бораи null дар Java омӯзед?
Зеро агар шумо ба нул аҳамият надиҳед, боварӣ ҳосил кунед, ки Java шуморо даҳшатнок мекунадjava.lang.NullPointerException
ва шумо дарси худро хоҳед гирифт, аммо шумо роҳи сахтро меравед. Навиштани рамзи ба садама тобовар як санъат аст ва дастаи шумо, муштариён ва корбарони шумо онро қадр хоҳанд кард. Дар таҷрибаи ман, яке аз сабабҳои асосӣ NullPointerException
ин набудани дониш дар бораи null дар Java мебошад. Бисёре аз шумо аллакай бо null шинос ҳастед, дигарон метавонанд чизҳои кӯҳна ва навро дар бораи калимаи калидии null омӯзанд. Биёед баъзе чизҳои муҳимро дар бораи null дар Java баррасӣ кунем ё омӯзем.
Дар Java чӣ null аст
Тавре ки ман гуфтам, null консепсияи хеле муҳим дар Java аст. Он дар ибтидо барои нишон додани набудани чизе ихтироъ шуда буд, ба монанди набудани корбар, манба ё дигар, аммо барномасозони Java-ро бо миқдори зиёдиnull pointer exception
. Дар ин дарс, мо далелҳои асосиро дар бораи калимаи калидии null дар Java меомӯзем ва баъзе ҳиллаҳоро барои пешгирӣ кардани мушкилот null pointer exceptions
ва кам кардани чекҳои null меомӯзем.
-
Аввалин чизест, ки null калимаи калидӣ дар Java аст, ба мисли
public
,static
ёfinal
. Регистр ҳассос аст, шумо null-ро ҳамчун Null ё NULL навишта наметавонед, компилятор онро эътироф намекунад ва хатогӣ содир мешавад.Object obj = NULL; // Not Ok Object obj1 = null //Ok
Зачастую, с этим встречаются программисты, перешедшие с других языков программирования, но при использовании современных IDE проблема становится незначительной. В наши дни, IDE вроде Eclipse or NetBeans могут исправлять эту ошибку пока Вы набираете code, но в эпоху Notepad, Vim и Emacs, это была распространенная проблема, которая могла съесть кучу драгоценного времени.
-
Так же, How каждый примитив имеет meaning по умолчанию, например, у
int
это 0, у boolean это false, null это meaning по умолчанию любых ссылочных типов, проще говоря, для всех an objectов. Так же, How при создании логической переменной ее meaning по умолчанию равно false, так и любые ссылочные переменные в Java по умолчанию будут равны null. Это истинно для всех типов переменных: переменной-члена or локальной переменной, переменной экземпляра or статической переменной, кроме того, компилятор будет ругаться, если Вы используете локальную переменную не проинициализировав ее.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
Это истинно How для статических, так и для не статических an objectов, How Вы можете видеть здесь, я сделал
myObj
статической ссылкой, так что я могу использовать ее непосредственно в методеmain
, который является статическим методом и не позволяет обращаться к не статическим переменным изнутри. -
Несмотря на распространенное заблуждение, null это не an object (
Object
) и ни тип. Это просто специальное meaning, которое может быть назначено любому ссылочному типу, и Вы можете привести null к любому типу, How показано ниже: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 к любому ссылочному типу пройдет успешно How во время компиляции, так и во время выполнения программы. В отличии от того, что многие из Вас возможно подумали, это не приведет к выбрасыванию
NullPointerException
. -
null может быть назначен только ссылочному типу, Вы не можете назначить null примитивной переменной вроде
int
,double
,float
orboolean
. Компилятор выразит Вам свое недовольство если Вы сделаете How показано ниже: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 an objectу класса-обертки, а затем присвоить этот an object соответствующему примитивному типу, компилятор не отреагирует, но мы будем вознаграждены
null pointer exception
во время выполнения. Это происходит из-за авто упаковки (autoboxing
) в Java, и мы еще встретимся с ним в следующем пункте. -
Любой класс-обертка со meaningм null будет выбрасывать
java.lang.NullPointerException
когда Java распакует(unbox
) его в примитивную переменную. Некоторые программисты делают ошибку допуская, что авто упаковка(autoboxing
) позаботится о конвертации null в meaning по умолчанию для соответствующего примитивного типа, например, 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
. Рамзи дар зер нишон додашуда баробари иҷро кардани он қатъ мегардад.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)
Ин code хеле содда ва безарар менамояд. Шумо танҳо ҳисоб мекунед, ки рақам дар массив чанд маротиба пайдо мешавад, як усули классикии дарёфти такрорӣ. Таҳиягар миқдори қаблан ҳисобшударо гирифта, онро як маротиба зиёд мекунад ва дубора ба
Map
.Integer
Вай шояд фикр кунад, ки автомат-бокс ба табдorint
, мисли он вақте ки ин метод даъват карда мешавадput()
, ғамхорӣ мекунад, аммо ӯ фаромӯш мекунад, ки агар рақам то ҳол ҳисоб карда нашуда бошад, усул нулget()
бармегардадHashMap
, на сифр, зеро арзиши пешфарз is Integer ин нул аст, на 0 ваnull pointer exception
ҳангоми кӯшиши табдил додани адади бутун ба тағирёбанда худкор қуттӣ мепартоядint
. -
Агар ягон тағирёбандаи истинод бо арзиши null ё null ҳамчун параметр муайян карда шуда бошад, оператор
instanceof
хато бармегардонад. Мисол: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
Ин як хосияти муҳими оператор аст
instanceof
, ки онро барои санҷиши навъҳои таркиш муфид мекунад. -
Шумо медонед, ки шумо наметавонед усули ғайристатикиро дар як тағирёбандаи истинодҳои нул даъват кунед, он -ро даъват мекунад
NullPointerException
, аммо шумо шояд намедонед, ки шумо метавонед усули статикиро дар тағирёбандаи истинодҳои нул даъват кунед. Зеро усулҳои статикӣ ҳатмии статикиро истифода мебаранд, онҳо намепартояндNullPointerException
. Инак як мисол: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)
-
Шумо метавонед null -ро ҳамчун параметр ба усуле гузаронед, ки ҳама гуна намуди истинодро қабул мекунад, масалан:
public void print(Object obj)
монанди номидан мумкин аст
print(null)
Ин аз нуқтаи назари компилятор муқаррарӣ аст, аммо рафтори минбаъда комилан ба усул вобаста аст. Усули безарар нест, намепартояд
NullPointerException
, балки ба таври оддӣ берун мешавад. Агар мантиқи тиҷорӣ иҷозат диҳад, тавсия дода мешавад, ки усулҳои бехатарро нависед. -
Шумо метавонед нулро бо истифода аз операторҳои
==
(баробар) ва!=
(баробар) муқоиса кунед, аммо шумо онро бо дигар операторҳои арифметикӣ ё мантиқӣ, ба монанди<
(камтар аз) ё>
(бузургтар аз) истифода карда наметавонед. Баръакси SQL, Java,null == null
тавре ки дар зер нишон дода шудааст, бармегардад: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
, шумо метавонед рамзи худро бехатар созед. Зеро null-ро метавон ҳамчун арзиши холӣ ё ибтидонашуда баррасӣ кард, ин аксар вақт манбаи нофаҳмиҳо аст, бинобар ин ҳуҷҷатгузорӣ кардани рафтори усул ҳангоми ворид кардани арзиши сифр муҳим аст. Ҳамеша дар хотир доред, ки null арзиши пешфарзии тағирёбандаҳои истинод аст ва шумо наметавонед ба усулҳои мисол занг занед ё бо истифода аз истинодҳои нул дар Java ба тағирёбандаҳои мисол дастрасӣ пайдо кунед.
GO TO FULL VERSION