Näme üçin Java-da null hakda öwrenmeli?
Sebäbi nulllara üns bermeseňiz, Java-yň sizi gaty ejir çekjekdiginejava.lang.NullPointerException
we sapagyňyzy öwrenjekdigiňize ynanyp bilersiňiz, ýöne kyn ýoldan geçersiňiz. Crashykylmaga çydamly kod ýazmak bir sungat we toparyňyz, müşderileriňiz we ulanyjylaryňyz muňa ýokary baha bererler. Meniň tejribämde, esasy sebäpleriň biri NullPointerException
Java-da null hakda bilimiň bolmazlygydyr. Köpüňiz eýýäm null bilen tanyş, galanlaryňyz null açar söz hakda käbir köne we täze zatlary öwrenip bilersiňiz. Java-da null hakda käbir möhüm zatlary gözden geçireliň ýa-da öwreneliň.
Java-da manysyz
Aýdyşym ýaly, null Java-da gaty möhüm düşünje. Ilkibaşda ulanyjynyň, çeşmäniň ýa-da başga zadyň ýoklugy ýaly bir zadyň ýoklugyny görkezmek üçin oýlanyp tapyldy, ýöne Java programmaçylaryny köp geň galdyrdynull pointer exception
. Bu gollanmada, Java-da null açar söz hakda esasy maglumatlary öwreneris we kynçylyklardan gaça durmak null pointer exceptions
we null barlaglary azaltmak üçin käbir usullary öwreneris.
-
public
Ilki bilen ilki zatlar, nullstatic
ýaly Java-da açar sözfinal
. Kazyýet duýgur, Null ýa-da NULL diýip null ýazyp bilmersiňiz, düzüji ony tanamaz we ýalňyşlyk goýberiler.Object obj = NULL; // Not Ok Object obj1 = null //Ok
Bu köplenç beýleki programmirleme dillerinden geçen programmistler bilen gabat gelýär, ýöne häzirki zaman IDE-lerini ulananyňyzda mesele ähmiýetsiz bolýar. Şu günler “Eclipse” ýa-da “NetBeans” ýaly IDE-ler ýazanyňyzda bu ýalňyşlygy düzedip biler, emma Notepad, Vim we Emacs döwründe bu köp gymmatly wagt iýip bilýän umumy mesele.
-
Так же, 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
. Выполнение codeа, показанного ниже прервется, How только Вы его запустите.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)
Bu kod gaty ýönekeý we zyýansyz görünýär. Diňe bir massiwde näçe gezek peýda bolandygyny sanap bilersiňiz, dublikatlary tapmagyň nusgawy usuly. Öndüriji öňki sanalan mukdary alýar, ony köpeldýär we gaýtadan goýýar
Map
. Awto-boks , usul çagyrylanda bolşy ýalyInteger
öwrülişi barada alada eder diýip pikir edip biler , ýöne san entek sanalmadyk bolsa, usulyň nola däl-de, nula gaýdyp geljekdigini ýatdan çykarýar , sebäbi deslapky baha “Integer” bu 0 däl-de, “Integer” -i üýtgeýjä öwürjek bolanda awto-boks atar .int
put()
get()
HashMap
null pointer exception
int
-
Parametr
instanceof
hökmünde null ýa-da null bahasy bolan islendik salgylanma üýtgeýjisi ýalňyş görkezer. Mysal: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
Bu, operatoryň möhüm häsiýeti bolup,
instanceof
görnüşi çykdajylaryny barlamak üçin peýdaly edýär. -
Statik däl usulda null salgylanma üýtgeýjisine jaň edip bilmejekdigiňizi bilýärsiňiz, jaň eder
NullPointerException
, ýöne null salgylanma üýtgeýjisinde statiki usuly çagyryp biljekdigiňizi bilmezligiňiz mümkin. Sebäbi statiki usullar statiki baglanyşygy ulanýarlar, zyňmaýarlarNullPointerException
. Ine bir mysal: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)
-
Nullary parametr hökmünde islendik salgy görnüşini kabul edýän usula geçirip bilersiňiz, mysal üçin:
public void print(Object obj)
ýaly atlandyryp bolar
print(null)
Bu düzüjiniň nukdaýnazaryndan adaty zat, ýöne soňraky özüni alyp barşy doly usula baglydyr. Ygtybarly usul zyňmaz
NullPointerException
, ýöne sypaýylyk bilen çykar. Iş logikasy rugsat berse, howpsuz däl usullary ýazmak maslahat berilýär. -
==
(Deňdir) we (deň däl) operatorlary ulanyp, null deňeşdirip bilersiňiz , ýöne beýleki arifmetiki ýa-da logiki operatorlar bilen (az) ýa-da (ondan uly)!=
ulanyp bilmersiňiz . SQL-den tapawutlylykda Java aşakda görkezilişi ýaly hakykata gaýdyp geler:<
>
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
koduňyzy ygtybarly edip bilersiňiz. Sebäbi null boş ýa-da başlangyç baha hökmünde seredilip bilner, bu köplenç bulaşyklygyň çeşmesidir, şonuň üçin null bahasy girizilende usulyň özüni alyp barşyny resminamalaşdyrmak möhümdir. Elmydama ýadyňyzdan çykarmaň, null salgylanma üýtgeýjileriniň deslapky bahasydyr, we Java-da null salgylanma ulanyp, mysal usullaryna ýa-da mysal üýtgeýjilerine jaň edip bilmersiňiz.
GO TO FULL VERSION