JavaRush /Java Blog /Random-IT /9 cose su NULL in Java
Sdu
Livello 17

9 cose su NULL in Java

Pubblicato nel gruppo Random-IT
Java e null vanno di pari passo. Difficilmente esiste un programmatore Java che non abbia riscontrato una " eccezione del puntatore nullo " e questo è un fatto triste. Anche l'inventore del concetto "nullo" lo ha definito un errore da un miliardo di dollari, allora perché Java lo supporta? null è qui da molto tempo e immagino che i creatori di Java sappiano che crea più problemi di quanti ne risolva, quindi perché continuano a sopportarlo. E questo mi sorprende ancora di più perché la filosofia di Java è stata quella di semplificare le cose, motivo per cui non si scherza più con puntatori, sovraccarico degli operatori ed ereditarietà multipla, ma perché null? 9 cose su NULL in Java - 1Beh, in realtà non conosco la risposta a questa domanda, ma quello che so è che non importa quanto il nulla venga criticato dai programmatori Java e dalla comunità open source, dobbiamo conviverci. Invece di pentirsene, è meglio saperne di più ed essere sicuri di utilizzare null correttamente.

Perché dovresti conoscere null in Java?

Perché se non presti attenzione a null, puoi star certo che Java ti farà soffrire terribilmente java.lang.NullPointerExceptione imparerai la lezione, ma andrai nel modo più duro. Scrivere codice resistente agli urti è un'arte e il tuo team, i clienti e gli utenti lo apprezzeranno. Nella mia esperienza, uno dei motivi principali NullPointerExceptionè la mancanza di conoscenza di null in Java. Molti di voi hanno già familiarità con null, il resto di voi sarà in grado di imparare alcune cose vecchie e nuove sulla parola chiave null. Rivediamo o impariamo alcune cose importanti su null in Java.

Cosa è nullo in Java

Come ho detto, null è un concetto molto, molto importante in Java. È stato originariamente inventato per indicare l'assenza di qualcosa, come l'assenza di un utente, di una risorsa o altro, ma ha sconcertato i programmatori Java con molti problemi null pointer exception. In questo tutorial impareremo i fatti di base sulla parola chiave null in Java e impareremo alcuni trucchi per evitare problemi null pointer exceptionse ridurre al minimo i controlli null.
  1. Per prima cosa, null è una parola chiave in Java, proprio come public, statico final. È sensibile al maiuscolo/minuscolo, non è possibile scrivere null come Null o NULL, il compilatore non lo riconoscerà e verrà generato un errore.

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

    Questo problema viene spesso riscontrato dai programmatori che sono passati da altri linguaggi di programmazione, ma quando si utilizzano IDE moderni il problema diventa insignificante. Al giorno d'oggi, IDE come Eclipse o NetBeans possono correggere questo errore durante la digitazione, ma nell'era di Blocco note, Vim ed Emacs, questo era un problema comune che poteva richiedere molto tempo prezioso.

  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)

    Questo codice sembra molto semplice e innocuo. Conti semplicemente quante volte un numero appare in un array, una tecnica classica per trovare duplicati. Lo sviluppatore prende la quantità conteggiata precedente, la aumenta di uno e la inserisce nuovamente nel file Map. Potrebbe pensare che l'auto-boxing si occuperà della conversione Integerin int, come quando viene chiamato il metodo put(), ma dimentica che se il numero non è stato ancora contato, il metodo get()restituirà HashMapnull, non zero, perché il valore predefinito is Integer questo è null, non 0, e il boxing automatico genererà un'eccezione null pointer exceptionquando si tenta di convertire un numero intero in una variabile int.

  6. L'operatore instanceofrestituirà false se come parametro viene specificata una variabile di riferimento con valore null o null stesso. Esempio:

    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

    Questa è una proprietà importante dell'operatore instanceofche lo rende utile per testare i cast di tipo.

  7. Sai che non puoi chiamare un metodo non statico su una variabile di riferimento nulla, chiamerà NullPointerException, ma potresti non sapere che puoi chiamare un metodo statico su una variabile di riferimento nulla. Perché i metodi statici utilizzano l'associazione statica, non eliminano i file NullPointerException. Ecco un esempio:

    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. Puoi passare null come parametro a un metodo che accetta qualsiasi tipo di riferimento, ad esempio:

    public void print(Object obj)

    può essere chiamato come

    print(null)

    Questo è normale dal punto di vista del compilatore, ma il comportamento successivo dipende interamente dal metodo. Un metodo null-safe non genererà un'eccezione NullPointerException, ma uscirà semplicemente con garbo. Se la logica aziendale lo consente, è consigliabile scrivere metodi null-safe.

  9. Puoi confrontare null utilizzando gli operatori ==(uguale) e !=(non uguale), ma non puoi usarlo con altri operatori aritmetici o logici come <(minore di) o >(maggiore di). A differenza di SQL, Java null == nullrestituirà true come mostrato di seguito:

    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
Si tratta di null in Java. Acquisendo una certa esperienza nella programmazione Java e utilizzando semplici trucchi per evitare NullPointerException, puoi rendere sicuro il tuo codice. Perché null può essere trattato come un valore vuoto o non inizializzato, questo è spesso fonte di confusione, motivo per cui è importante documentare il comportamento di un metodo quando viene immesso un valore null. Ricorda sempre che null è il valore predefinito delle variabili di riferimento e non puoi chiamare metodi di istanza o accedere a variabili di istanza utilizzando un riferimento null in Java.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION