JavaRush /وبلاگ جاوا /Random-FA /9 چیز در مورد NULL در جاوا
Sdu
مرحله

9 چیز در مورد NULL در جاوا

در گروه منتشر شد
جاوا و نول دست به دست هم می دهند. به ندرت برنامه نویس جاوای وجود دارد که با " استثنای اشاره گر تهی " مواجه نشده باشد و این یک واقعیت غم انگیز است. حتی مخترع مفهوم "تهی" آن را اشتباه میلیارد دلاری خود نامید، پس چرا جاوا از آن پشتیبانی می کند؟ null مدت زیادی است که اینجا وجود داشته است، و من حدس می‌زنم سازندگان جاوا می‌دانند که بیشتر از حل کردن آن مشکلات ایجاد می‌کند، پس چرا هنوز آن را تحمل می‌کنند. و این من را بیشتر متعجب می کند زیرا فلسفه جاوا ساده کردن کارها بوده است، به همین دلیل است که آنها دیگر با اشاره گرها، بارگذاری بیش از حد اپراتور و وراثت چندگانه به هم نمی خورند، اما چرا پوچ؟ 9 چیز در مورد NULL در جاوا - 1خب، من واقعا پاسخ این سوال را نمی دانم، اما چیزی که می دانم این است که مهم نیست که برنامه نویسان جاوا و جامعه متن باز چقدر از null انتقاد می کنند، ما باید با آن زندگی کنیم. به جای پشیمانی بهتر است بیشتر بدانید و مطمئن باشید که از null درست استفاده می کنیم.

چرا باید در مورد null در جاوا یاد بگیرید؟

چون اگر به null توجه نکنید مطمئن باشید که جاوا به طرز وحشتناکی شما را به دردسر می اندازد java.lang.NullPointerExceptionو درس خود را یاد می گیرید اما راه سخت را خواهید رفت. نوشتن کد مقاوم در برابر خرابی یک هنر است و تیم شما، مشتریان و کاربران از آن قدردانی خواهند کرد. طبق تجربه من، یکی از دلایل اصلی NullPointerExceptionعدم اطلاع از null در جاوا است. بسیاری از شما در حال حاضر با null آشنا هستید، بقیه شما می توانید چیزهای قدیمی و جدیدی در مورد کلمه کلیدی null یاد بگیرید. بیایید نکات مهمی را در مورد null در جاوا مرور کنیم یا یاد بگیریم.

آنچه در جاوا null است

همانطور که گفتم، null یک مفهوم بسیار بسیار مهم در جاوا است. در ابتدا برای نشان دادن عدم وجود چیزی مانند عدم وجود کاربر، منبع یا هر چیز دیگری اختراع شد، اما برنامه نویسان جاوا را با تعداد زیادی گیج کرده است null pointer exception. در این آموزش، حقایق اساسی در مورد کلمه کلیدی null در جاوا را یاد می گیریم و چند ترفند برای جلوگیری از مشکل null pointer exceptionsو به حداقل رساندن بررسی های پوچ را یاد می گیریم.
  1. اول از همه، null یک کلمه کلیدی در جاوا است، درست مانند public، staticیا final. حروف کوچک و کوچک حساس است، شما نمی توانید null را به صورت Null یا NULL بنویسید، کامپایلر آن را تشخیص نمی دهد و یک خطا ایجاد می شود.

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

    اغلب برنامه نویسانی که از زبان های برنامه نویسی دیگر سوئیچ کرده اند، با این مشکل مواجه می شوند، اما هنگام استفاده از IDE های مدرن، مشکل ناچیز می شود. این روزها، IDE هایی مانند 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عدد صحیح null pointer exceptionاست int.

  6. instanceofاگر هر متغیر مرجع با مقدار null یا خود null به عنوان پارامتر مشخص شود، عملگر false را برمی گرداند. مثال:

    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 را مقایسه کنید، اما نمی توانید آن را با سایر عملگرهای حسابی یا منطقی مانند <(کمتر از) یا >(بزرگتر از) استفاده کنید. برخلاف SQL، جاوا مطابق null == nullشکل زیر مقدار 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 در جاوا است. با کسب تجربه در برنامه نویسی جاوا و استفاده از ترفندهای ساده برای جلوگیری از آن NullPointerException، می توانید کد خود را ایمن کنید. زیرا null را می توان به عنوان یک مقدار خالی یا بدون مقدار اولیه در نظر گرفت، این اغلب یک منبع سردرگمی است، به همین دلیل مهم است که رفتار یک متد را زمانی که یک مقدار null وارد می شود، مستند کنیم. همیشه به یاد داشته باشید، null مقدار پیش‌فرض متغیرهای مرجع است و شما نمی‌توانید با استفاده از مرجع تهی در جاوا، متدهای نمونه را فراخوانی کنید یا به متغیرهای نمونه دسترسی پیدا کنید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION