JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ NULL بابت 9 شيون
Sdu
سطح

جاوا ۾ NULL بابت 9 شيون

گروپ ۾ شايع ٿيل
جاوا ۽ نول ھٿ ۾ ھلندا آھن. شايد ئي ڪو جاوا پروگرامر هجي جنهن کي ” نال پوائنٽر استثنا “ نه مليو هجي ۽ اها هڪ افسوسناڪ حقيقت آهي. ”نال“ تصور جي موجد به ان کي پنهنجي اربين ڊالرن جي غلطي قرار ڏنو ته پوءِ جاوا ان جي حمايت ڇو ٿو ڪري؟ null هتي هڪ ڊگهي وقت تائين آهي، ۽ مان سمجهان ٿو ته جاوا جي تخليق ڪندڙ ڄاڻن ٿا ته اهو حل ڪرڻ کان وڌيڪ مسئلا پيدا ڪري ٿو، پوء ڇو اهي اڃا تائين ان سان گڏ آهن. ۽ اها ڳالهه مون کي اڃا به وڌيڪ حيران ڪري ٿي ڇو ته جاوا جو فلسفو شين کي آسان ڪرڻ لاءِ رهيو آهي، اهو ئي سبب آهي ته اهي هاڻي پوائنٽرز، آپريٽر اوور لوڊنگ ۽ گھڻن ورثي جي حوالي سان گڙٻڙ نٿا ڪن، پر null ڇو؟ جاوا ۾ NULL بابت 9 شيون - 1خير، مان واقعي ان سوال جو جواب نه ٿو ڄاڻان، پر مون کي جيڪا خبر آهي ته اها آهي ته جاوا پروگرامرز ۽ اوپن سورس ڪميونٽي طرفان ڪيتري به تنقيد ڪئي وڃي، اسان کي ان سان گڏ رهڻو پوندو. ان تي افسوس ڪرڻ جي بدران، اهو بهتر آهي ته وڌيڪ سکڻ ۽ پڪ ڪريو ته اسان null صحيح استعمال ڪريون ٿا.

توهان کي جاوا ۾ null بابت ڇو سکڻ گهرجي؟

ڇاڪاڻ ته جيڪڏهن توهان null تي ڌيان نه ڏيو، توهان يقين ڪري سگهو ٿا ته جاوا توهان کي هڪ خوفناڪ طريقي سان نقصان پهچائيندو java.lang.NullPointerException۽ توهان پنهنجو سبق سکندا، پر توهان مشڪل طريقي سان ويندا. حادثي جي مزاحمتي ڪوڊ لکڻ هڪ فن آهي ۽ توهان جي ٽيم، گراهڪ ۽ استعمال ڪندڙ ان جي ساراهه ڪندا. منهنجي تجربي ۾، هڪ بنيادي سبب NullPointerExceptionجاوا ۾ null بابت ڄاڻ جي کوٽ آهي. توھان مان گھڻا اڳي ئي null کان واقف آھن، باقي توھان null ڪي ورڊ بابت ڪجھ پراڻيون ۽ نيون شيون سکي سگھندا. اچو ته جائزو وٺون يا سکون ڪجهه اهم شيون جاوا ۾ null بابت.

جاوا ۾ null ڇا آهي

جيئن مون چيو، null هڪ تمام، تمام اهم تصور آهي جاوا ۾. اهو اصل ۾ ايجاد ڪئي وئي هئي ڪنهن شيءِ جي غير موجودگيءَ کي ظاهر ڪرڻ لاءِ، جيئن صارف جي غير موجودگي، هڪ وسيلو، يا ٻيو ڪجهه، پر جاوا پروگرامرز کي حيران ڪري رهيو آهي تمام گهڻو null pointer exception. هن سبق ۾، اسان جاوا ۾ null لفظ جي باري ۾ بنيادي حقيقتون سکنداسون، ۽ ڪجهه ترڪيبون سکو ته جيئن مشڪلاتن کان بچڻ null pointer exceptions۽ null چيڪن کي گھٽ ڪرڻ.
  1. پهرين شيون پهرين، null جاوا ۾ هڪ لفظ آهي، جهڙوڪ public، staticيا final. ڪيس حساس آهي، توهان null کي Null يا NULL طور نٿا لکي سگهو، مرتب ڪندڙ ان کي نه سڃاڻندو ۽ هڪ غلطي اڇلائي ويندي.

    Object obj = NULL; // Not Ok
    Object obj1 = null //Ok

    اهو اڪثر پروگرامر سان منهن ڏيڻو پوندو آهي جيڪي ٻين پروگرامنگ ٻولين مان تبديل ڪيا آهن، پر جڏهن جديد IDEs استعمال ڪندا آهن، اهو مسئلو غير معمولي ٿي ويندو آهي. اڄڪلهه، IDEs جهڙوڪ Eclipse يا NetBeans توهان جي ٽائپ ڪرڻ دوران هن غلطي کي درست ڪري سگهن ٿا، پر Notepad، Vim ۽ Emacs جي دور ۾، اهو هڪ عام مسئلو هو جيڪو گهڻو قيمتي وقت کائي سگهي ٿو.

  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)

    هي ڪوڊ تمام سادو ۽ بي ضرر نظر اچي ٿو. توهان صرف ڳڻيو ٿا ته ڪيترا ڀيرا هڪ انگ هڪ صف ۾ ظاهر ٿئي ٿو، نقل ڳولڻ لاء هڪ کلاسک ٽيڪنڪ. ڊولپر اڳوڻو ڳڻيل مقدار وٺي ٿو، ان کي ھڪڙي وڌائي ٿو ۽ ان کي واپس داخل ڪري ٿو Map. Integerهو سوچي سگهي ٿو ته آٽو باڪسنگ ۾ تبديليءَ جو خيال رکيو ويندو int، جيئن اهو ٿيندو آهي جڏهن طريقي کي سڏيو ويندو آهي put()، پر هو اهو وساري ٿو ته جيڪڏهن تعداد اڃا نه ڳڻيو ويو آهي، ته طريقو صفر نه، پر صفر get()واپس ايندو HashMap، ڇاڪاڻ ته ڊفالٽ قدر ڇا Integer اھو null آھي، 0 نھ، ۽ آٽو باڪسنگ اڇلائي ويندي null pointer exceptionجڏھن ھڪ Integer کي variable ۾ تبديل ڪرڻ جي ڪوشش ڪئي ويندي int.

  6. آپريٽر instanceofغلط موٽندو جيڪڏھن ڪو حوالو متغير قدر سان null يا null پاڻ کي پيٽرولر طور بيان ڪيو ويو آھي. مثال:

    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جيڪا ان کي ڪارائتو بڻائي ٿي ٽيسٽ قسم جي ڪاسٽ لاءِ.

  7. توهان کي خبر آهي ته توهان هڪ غير جامد طريقي کي ڪال نه ٿا ڪري سگهو null reference variable تي، اهو ڪال ڪندو NullPointerException، پر توهان کي خبر ناهي ته توهان null reference variable تي static طريقو ڪال ڪري سگهو ٿا. ڇاڪاڻ ته جامد طريقا جامد پابند استعمال ڪندا آهن، اهي اڇلائي نه ويندا آهن 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)
  8. توھان پاس ڪري سگھو ٿا null ھڪڙي نموني جي طور تي ھڪڙي طريقي سان جيڪو ڪنھن حوالي جي قسم کي قبول ڪري ٿو، مثال طور:

    public void print(Object obj)

    وانگر سڏي سگهجي ٿو

    print(null)

    اهو ڪمپلر جي نقطي نظر کان عام آهي، پر بعد ۾ رويي جو طريقو مڪمل طور تي منحصر آهي. هڪ غير محفوظ طريقو اڇلائي نه سگهندو NullPointerException، پر آسانيء سان ٻاهر نڪرندو. جيڪڏهن ڪاروباري منطق اجازت ڏئي ٿي، اها سفارش ڪئي وئي آهي ته نول-محفوظ طريقا لکڻ لاء.

  9. توهان ==(برابر) ۽ !=(برابر نه) آپريٽرز استعمال ڪندي null جو مقابلو ڪري سگهو ٿا، پر توهان ان کي ٻين رياضي يا منطقي آپريٽرن جهڙوڪ <(گهٽ کان گهٽ) يا >(کان وڌيڪ) سان استعمال نٿا ڪري سگهو. SQL جي برعڪس، جاوا 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
اهو سڀ ڪجهه جاوا ۾ null بابت آهي. جاوا پروگرامنگ ۾ ڪجھ تجربو حاصل ڪرڻ ۽ بچڻ لاءِ سادي چالون استعمال ڪندي NullPointerException، توھان پنھنجو ڪوڊ محفوظ ڪري سگھو ٿا. ڇاڪاڻ ته null کي خالي يا اڻ شروع ڪيل قدر سمجهي سگهجي ٿو، اهو اڪثر ڪري مونجهاري جو ذريعو هوندو آهي، جنهن ڪري اهو ضروري آهي ته ڪنهن طريقي جي رويي کي دستاويز ڪرڻ ضروري آهي جڏهن هڪ null قدر ان پٽ هجي. هميشه ياد رکو، null ريفرنس متغيرن جو ڊفالٽ قدر آھي، ۽ توھان جاوا ۾ null ريفرنس استعمال ڪندي مثال جي طريقن کي ڪال ڪري يا مثال متغير تائين رسائي نٿا ڪري سگھو.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION