JavaRush /Blogue Java /Random-PT /9 coisas sobre NULL em Java
Sdu
Nível 17

9 coisas sobre NULL em Java

Publicado no grupo Random-PT
Java e nulo andam de mãos dadas. Dificilmente existe um programador Java que não tenha encontrado uma " exceção de ponteiro nulo " e isso é um fato triste. Até o inventor do conceito "nulo" chamou isso de erro de um bilhão de dólares, então por que o Java o suporta? null está aqui há muito tempo, e acho que os criadores do Java sabem que ele cria mais problemas do que resolve, então por que eles ainda o toleram? E isso me surpreende ainda mais porque a filosofia do Java tem sido simplificar as coisas, e é por isso que eles não mexem mais com ponteiros, sobrecarga de operadores e herança múltipla, mas por que null? 9 coisas sobre NULL em Java - 1Bem, eu realmente não sei a resposta para essa pergunta, mas o que eu sei é que não importa o quanto null seja criticado pelos programadores Java e pela comunidade de código aberto, temos que conviver com isso. Em vez de se arrepender, é melhor aprender mais e ter certeza de que usamos null corretamente.

Por que você deveria aprender sobre null em Java?

Porque se você não prestar atenção em null, pode ter certeza que Java vai te fazer sofrer horrivelmente java.lang.NullPointerExceptione você aprenderá a lição, mas seguirá um caminho mais difícil. Escrever código resistente a falhas é uma arte e sua equipe, clientes e usuários irão apreciar isso. Na minha experiência, um dos principais motivos NullPointerExceptioné a falta de conhecimento sobre null em Java. Muitos de vocês já estão familiarizados com null, o restante poderá aprender algumas coisas antigas e novas sobre a palavra-chave null. Vamos revisar ou aprender algumas coisas importantes sobre null em Java.

O que é nulo em Java

Como eu disse, null é um conceito muito importante em Java. Foi originalmente inventado para indicar a ausência de algo, como a ausência de um usuário, um recurso ou qualquer outra coisa, mas tem intrigado os programadores Java com muitos recursos null pointer exception. Neste tutorial, aprenderemos os fatos básicos sobre a palavra-chave nula em Java e aprenderemos alguns truques para evitar problemas null pointer exceptionse minimizar verificações de nulos.
  1. Primeiramente, null é uma palavra-chave em Java, assim como public, staticou final. Diferencia maiúsculas de minúsculas, você não pode escrever null como Null ou NULL, o compilador não o reconhecerá e um erro será gerado.

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

    Muitas vezes, os programadores que mudaram de outras linguagens de programação enfrentam esse problema, mas ao usar IDEs modernos, o problema se torna insignificante. Hoje em dia, IDEs como Eclipse ou NetBeans podem corrigir esse erro enquanto você digita, mas na era do Notepad, Vim e Emacs, esse era um problema comum que poderia consumir muito tempo valioso.

  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)

    Este código parece muito simples e inofensivo. Você simplesmente conta quantas vezes um número aparece em uma matriz, uma técnica clássica para encontrar duplicatas. O desenvolvedor pega a quantidade contada anteriormente, aumenta em um e insere-a novamente no arquivo Map. Ele pode pensar que o auto-boxing cuidará da conversão Integerpara int, como acontece quando o método é chamado put(), mas esquece que se o número ainda não tiver sido contado, o método get()retornará HashMapnulo, e não zero, porque o valor padrão é Inteiro, é nulo, não 0, e o boxe automático será lançado null pointer exceptionao tentar converter um número inteiro em uma variável int.

  6. O operador instanceofretornará falso se qualquer variável de referência com o valor nulo ou o próprio nulo for especificada como parâmetro. Exemplo:

    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

    Esta é uma propriedade importante do operador instanceofque o torna útil para testar conversões de tipo.

  7. Você sabe que não pode chamar um método não estático em uma variável de referência nula, ele chamará NullPointerException, mas talvez você não saiba que pode chamar um método estático em uma variável de referência nula. Porque métodos estáticos usam ligação estática, eles não jogam fora NullPointerException. Aqui está um exemplo:

    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. Você pode passar null como parâmetro para um método que aceita qualquer tipo de referência, por exemplo:

    public void print(Object obj)

    pode ser chamado como

    print(null)

    Isso é normal do ponto de vista do compilador, mas o comportamento subsequente depende inteiramente do método. Um método seguro para nulos não lançará NullPointerException, mas simplesmente sairá normalmente. Se a lógica de negócios permitir, é recomendável escrever métodos seguros para nulos.

  9. Você pode comparar nulo usando os operadores ==(igual) e !=(diferente), mas não pode usá-lo com outros operadores aritméticos ou lógicos como <(menor que) ou >(maior que). Ao contrário do SQL, Java null == nullretornará verdadeiro conforme mostrado abaixo:

    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
Tudo isso é nulo em Java. Ao ganhar alguma experiência em programação Java e usar truques simples para evitar erros NullPointerException, você pode tornar seu código seguro. Porque null pode ser tratado como um valor vazio ou não inicializado, isso geralmente é uma fonte de confusão, por isso é importante documentar o comportamento de um método quando um valor nulo é inserido. Lembre-se sempre de que nulo é o valor padrão das variáveis ​​de referência e você não pode chamar métodos de instância ou acessar variáveis ​​de instância usando uma referência nula em Java.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION