Почти во всех языках программирования есть указатель null. Многие программисты сталкивались с проблемой из-за указателя null.

В Java, указатель null ассоциируется с ошибкой java.lang.NullPointerException. Это класс в пакете java.lang, он вызывается когда программист пытается обратиться к объекту, который ссылается на указатель null, к примеру

String s = null;
s.length(); // Тут возникнет ошибка NullPointerException

Ниже описываются некоторые важные особенности про указатель null в языке программирования Java, которые должен знать каждый программист, пишущий на Java.

Зарезериванные ключевые слова в Java регистрозависимые

В языке Java нельзя использоватьNULL или 0 для обозначения ссылки на указатель null, как это делается в языке C.

public class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // ошибка во время компиляции, так как Java не знает что такое 'NULL'
        Object obj = NULL;

        // Если так написать, то это сработает
        Object obj1 = null;
    }
}

Вывод программы:

5: error: cannot find symbol
 can't find symbol 'NULL'
                 ^
   variable NULL
 class Test
1 error

Любое значение переменной ссылочного типа по умолчанию принимает значение null.

public class Test
{
    private static Object obj;
    public static void main(String args[])
    {
        // Выведит null
        System.out.println("Value of object obj is : " + obj);
    }
}

Вывод программы:

Value of object obj is : null

null это не объект и не тип, это специальное значение в языке Java, которое может быть присвоено любой переменной ссылочного типа.

    // null может быть присвоено переменной типа String
    String str = null;

    Integer itr = null;

    Double dbl = null;

    String myStr = (String) null;

    Integer myItr = (Integer) null;

    Double myDbl = (Double) null;

Автоматическое приведение ссылочного типа к примитивному типу данных может вызывать ошибку NullPointerException,

если ссылочное значение равно null.

public class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
            // Можно делать так
            Integer i = null;

            // Однако, при попытке привести ссылочный тип, который равен null к примитивному - будет ошибка
            int a = i;
    }
}

Вывод программы:

 Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:6)

оператор instaceof, которые используетяс для тестирования принадлежности объекта к тому или иному типу/классу

Это очень важно! Если использовать instanceof с переменной ссылочного типа, которой присвоено значение null, то результат будет false.

public class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Integer i = null;
        Integer j = 10;

        // вернет false, вроде бы тип Integer, однако, сравнивается само значение, а значение 'null'
        System.out.println(i instanceof Integer);

        // Отработает как ожидается
        System.out.println(j instanceof Integer);
    }
}

Вывод программы:

false
true

Статические и не статические методы

Мы не можем вызывать не статический метод переменной ссылочного типа, которой присвоено значение null, это вызовет ошибку NullPointerException.

public class Test
{             
    public static void main(String args[])
    {
        Test obj= null;
        obj.staticMethod();
        obj.nonStaticMethod(); // тут возникнет ошибка NullPointerException                             
    }

    private static void staticMethod()
    {
        // Этот меод можно вызывать, так как он статический
        System.out.println("static method, can be called by null reference");

    }

    private void nonStaticMethod()
    {
        // Этот метод нельзя вызывать, потому что он не статический
        System.out.print(" Non-static method- ");
        System.out.println("cannot be called by null reference");

    }

}

Операторы сравнения == и !=

Эти операторы можно применять с указателем null. Это может быть использовано для проверки объекта на значение null

public class Test
{             
    public static void main(String args[])
    {

    //return true;
    System.out.println(null==null);

    //return false;
    System.out.println(null!=null);

    }
}

Оригинальная статья на английском доступна здесь.