JavaRush /مدونة جافا /Random-AR /9 أشياء عن NULL في جافا
Sdu
مستوى

9 أشياء عن NULL في جافا

نشرت في المجموعة
Java و null يسيران جنبًا إلى جنب. لا يكاد يوجد مبرمج جافا لم يواجه " استثناء المؤشر الفارغ " وهذه حقيقة حزينة. حتى مخترع مفهوم "الصفر" أطلق عليه خطأ مليار دولار، فلماذا تدعمه Java؟ لقد كانت null هنا منذ فترة طويلة، وأعتقد أن منشئي Java يعرفون أنها تخلق مشاكل أكثر مما تحل، فلماذا لا يزالون يتحملونها. وهذا يفاجئني أكثر لأن فلسفة Java كانت تبسيط الأشياء، ولهذا السبب لم تعد تعبث بالمؤشرات والتحميل الزائد للمشغل والميراث المتعدد بعد الآن، ولكن لماذا لا شيء؟ 9 أشياء عن NULL في جافا - 1حسنًا، لا أعرف حقًا إجابة هذا السؤال، لكن ما أعرفه هو أنه بغض النظر عن مدى انتقاد مبرمجي Java ومجتمع المصادر المفتوحة للقيمة null، علينا أن نتعايش معها. بدلاً من الندم على ذلك، من الأفضل معرفة المزيد والتأكد من أننا نستخدم القيمة null بشكل صحيح.

لماذا يجب أن تتعلم عن null في Java؟

لأنه إذا لم تهتم بالقيمة الفارغة، فيمكنك التأكد من أن Java ستجعلك تعاني بطريقة رهيبة java.lang.NullPointerExceptionوستتعلم الدرس، لكنك ستمضي في الطريق الصعب. تعد كتابة تعليمات برمجية مقاومة للأعطال فنًا وسيقدره فريقك وعملائك ومستخدميك. في تجربتي، أحد الأسباب الرئيسية NullPointerExceptionهو نقص المعرفة حول القيمة الفارغة في Java. الكثير منكم على دراية بالكلمة الأساسية null، أما البقية فسيتمكنون من تعلم بعض الأشياء القديمة والجديدة حول الكلمة الأساسية null. دعونا نراجع أو نتعلم بعض الأشياء المهمة حول null في Java.

ما هو فارغ في جافا

كما قلت، يعد null مفهومًا مهمًا جدًا جدًا في Java. تم اختراعه في الأصل للإشارة إلى غياب شيء ما، مثل غياب مستخدم أو مورد أو أي شيء آخر، ولكنه كان يحير مبرمجي Java بالكثير من null pointer exception. في هذا البرنامج التعليمي، سوف نتعلم الحقائق الأساسية حول الكلمة الأساسية الخالية في Java، ونتعلم بعض الحيل لتجنب المشكلات null pointer exceptionsوتقليل عمليات التحقق من القيمة الفارغة.
  1. أول الأشياء أولاً، null هي كلمة رئيسية في Java، تمامًا مثل 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صفرًا، وليس صفرًا، لأن القيمة الافتراضية هو عدد صحيح، وهو فارغ وليس 0، وسيتم طرح الملاكمة التلقائية null pointer exceptionعند محاولة تحويل عدد صحيح إلى متغير 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. أنت تعلم أنه لا يمكنك استدعاء طريقة غير ثابتة على متغير مرجعي فارغ، فسوف تستدعي 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)
  8. يمكنك تمرير null كمعلمة إلى طريقة تقبل أي نوع مرجع، على سبيل المثال:

    public void print(Object obj)

    يمكن أن يسمى مثل

    print(null)

    يعد هذا أمرًا طبيعيًا من وجهة نظر المترجم، لكن السلوك اللاحق يعتمد كليًا على الطريقة. لن تقوم الطريقة الآمنة الخالية برمي NullPointerException، ولكنها ستخرج ببساطة بأمان. إذا كان منطق العمل يسمح بذلك، فمن المستحسن كتابة أساليب خالية من الأمان.

  9. يمكنك مقارنة القيمة الخالية باستخدام عاملي التشغيل ==(يساوي) و !=(غير متساوي)، لكن لا يمكنك استخدامها مع عوامل حسابية أو منطقية أخرى مثل <(أقل من) أو >(أكبر من). null == nullعلى عكس SQL، ستعيد Java القيمة true كما هو موضح أدناه:

    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 في Java. من خلال اكتساب بعض الخبرة في برمجة Java واستخدام حيل بسيطة يمكنك تجنبها NullPointerException، يمكنك جعل التعليمات البرمجية الخاصة بك آمنة. لأن يمكن التعامل مع القيمة null كقيمة فارغة أو غير مهيأة، وهذا غالبًا ما يكون مصدرًا للارتباك، ولهذا السبب من المهم توثيق سلوك الطريقة عند إدخال قيمة فارغة. تذكر دائمًا أن القيمة null هي القيمة الافتراضية للمتغيرات المرجعية، ولا يمكنك استدعاء أساليب المثيل أو الوصول إلى متغيرات المثيل باستخدام مرجع فارغ في Java.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION