JavaRush /Java Blog /Random-TK /Java-da NULL hakda 9 zat
Sdu
Dereje

Java-da NULL hakda 9 zat

Toparda çap edildi
Java we null biri-birine ýakynlaşýar. " Null görkeziji kadadan çykma " bilen ýüzbe-ýüz bolmadyk Java programmisti ýok we bu gynandyryjy hakykat. Hatda "null" düşünjäni oýlap tapyjy hem ony milliard dollarlyk ýalňyşlyk diýip atlandyrdy, näme üçin Java muny goldaýar? null bu ýerde köp wagt bäri işleýär we Java döredijileriniň çözýäninden has köp problema döredýändigini bilýärler öýdýärin, näme üçin henizem bu meseläni çözýärler? Bu meni hasam geň galdyrýar, sebäbi Java-yň pelsepesi zatlary ýönekeýleşdirmekdi, şonuň üçin olar görkezijiler, operatorlaryň aşa köp ýüklenmegi we köp miras bilen bulaşmaýarlar, ýöne näme üçin puja çykýarlar? Java-da NULL hakda 9 zat - 1Dogrusy, bu soragyň jogabyny bilemok, ýöne bilýän zadym, Java programmistleri we açyk jemgyýet tarapyndan näçe tankyt edilse-de, biz onuň bilen ýaşamaly. Puşman etmegiň ýerine, has köp zat öwrenmek we null dogry ulanýandygymyzy anyklamak has gowudyr.

Näme üçin Java-da null hakda öwrenmeli?

Sebäbi nulllara üns bermeseňiz, Java-yň sizi gaty ejir çekjekdigine java.lang.NullPointerExceptionwe 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 NullPointerExceptionJava-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ň galdyrdy null pointer exception. Bu gollanmada, Java-da null açar söz hakda esasy maglumatlary öwreneris we kynçylyklardan gaça durmak null pointer exceptionswe null barlaglary azaltmak üçin käbir usullary öwreneris.
  1. publicIlki bilen ilki zatlar, null staticýaly Java-da açar söz final. 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.

  2. Так же, 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, который является статическим методом и не позволяет обращаться к не статическим переменным изнутри.

  3. Несмотря на распространенное заблуждение, 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.

  4. null может быть назначен только ссылочному типу, Вы не можете назначить null примитивной переменной вроде int, double, float or boolean. Компилятор выразит Вам свое недовольство если Вы сделаете 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, и мы еще встретимся с ним в следующем пункте.

  5. Любой класс-обертка со 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 ýaly Integerö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 .intput()get()HashMapnull pointer exceptionint

  6. Parametr instanceofhö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, instanceofgörnüşi çykdajylaryny barlamak üçin peýdaly edýär.

  7. 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ýarlar NullPointerException. 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)
  8. 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.

  9. ==(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
Bularyň hemmesi Java-da null. Java programmirlemekde birneme tejribe toplamak we öňüni almak üçin ýönekeý hileleri ulanmak bilen NullPointerExceptionkoduň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.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION