Perché posso lanciare null in Java?


Answers

perché lo trasmette a NullPointerException?

Come da specifies :

Una dichiarazione di lancio valuta prima l'espressione. Se la valutazione dell'Espressione termina bruscamente per qualche motivo, allora il lancio termina bruscamente per quel motivo. Se la valutazione dell'Espressione viene completata normalmente, producendo un valore V non nullo, l'istruzione di lancio viene completata improvvisamente, la ragione è un lancio con valore V. Se la valutazione dell'Espressione viene completata normalmente, producendo un valore nullo, quindi un'istanza V ' della classe NullPointerException viene creata e lanciata invece di null. L'affermazione del lancio si conclude bruscamente, il motivo è un lancio con valore V '.

Perché posso buttare null in java?

Puoi lanciare oggetti di tipo Throwable e dato che null è un riferimento valido per Throwable , il compilatore lo consente.

Questo è ciò che dice Neal Gafter

Sebbene null sia assegnabile a ogni tipo di riferimento, il tipo di null non è di per sé un tipo di riferimento. La nostra intenzione era che il requisito che l'espressione in un'istruzione throw fosse un tipo di riferimento doveva essere rimosso dalla terza edizione del JLS, ma tale modifica non è mai stata effettivamente apportata alla versione pubblicata. Quindi, questo è un bug del compilatore javac che ho introdotto in SE 5.

Question

Quando si esegue questo:

public class WhatTheShoot {

    public static void main(String args[]){
        try {
            throw null;
        } catch (Exception e){
            System.out.println(e instanceof NullPointerException);
            System.out.println(e instanceof FileNotFoundException);
        }
    }
}

La risposta è:

true  
false

Il che è stato abbastanza sorprendente per me. Avrei pensato che questo avrebbe comportato un errore in fase di compilazione.

Perché posso lanciare null in Java e perché lo trasmette a NullPointerException?

(In realtà, non so se è un "upcast", dato che sto lanciando nulla)

A parte una domanda di intervista davvero stupida (per favore nessuno lo chieda in un'intervista) Non vedo alcun motivo per throw null . Forse vuoi essere licenziato, ma questo è ... voglio dire, perché altrimenti qualcuno dovrebbe throw null ?

Un fatto divertente IntelliJ IDEA 12 mi dice che la mia linea, e instanceof NullPointerException , sarà sempre falsa. Il che non è affatto vero.




null può essere lanciato su qualsiasi cosa *, inclusa un'eccezione. Proprio come potresti restituire null se la tua firma del metodo specifica che dovresti restituire un'eccezione (o in effetti una stringa, o una classe Person), puoi lanciarla.

* Esclusi i tipi primitivi.




Pensarci in questo modo rende un po 'più ovvio il motivo per cui questo funziona:

try {
    Exception foo = null;
    if(false) {
        foo = new FileNotFoundException();
    } // Oops, forgot to set foo for the true case..
    throw foo;
} catch (Exception e){
    System.out.println(e instanceof NullPointerException);
    System.out.println(e instanceof FileNotFoundException);
}



Links