2012-12-17 19 views
15

Se il codice è possibile:assegnando un valore nullo per un int

Integer a = null; 
int b = a; 

cosa significa che una funzione che restituisce un valore possibile null per un intero è una cattiva pratica?

Modifica 1: Ci sono diverse opinioni in queste risposte. Non sono abbastanza sicuro di scegliere l'uno o l'altro.

+5

Tony Hoare, l'inventore di null, lo chiama il suo errore da un miliardo di dollari. Evita "null" in generale. –

+0

Non è una cattiva pratica se è necessario sapere che il valore è sconosciuto. La gestione delle eccezioni per 'NullPointerException' può essere incorporata nel codice per riflettere l'assenza, convertire il NULL INT in uno zero, ecc. [NULL] (http://en.wikipedia.org/wiki/Null_%28SQL%29) è un male necessario, ci sono casi in cui è necessario identificare chiaramente uno sconosciuto o un'assenza di valore, ad esempio: quante volte mi sposerò, data di morte, ecc. –

+0

@ TomHawtin-tackline quindi tutto ciò che sappiamo è che era sbagliato almeno una volta, quando quello era non solo in discussione ma anche fuori tema. Considerando che questa domanda non riguarda la progettazione del linguaggio e null è parte integrante di java che afferma che anche le credenze di un progettista di linguaggio sono inutili – josefx

risposta

38

Quel codice darà un NullPointerException quando lo eseguite. Fondamentalmente è equivalente a:

Integer a = null; 
int b = a.intValue(); 

... il che rende più chiaro che effettivamente fallirà.

Non sei davvero assegnare un valore nullo ad un int - stai provando e fallendo.

È possibile utilizzare null come valore per un Integer; anzi spesso Integer è usato al posto di int appunto come "equivalent` annullabile.

+0

Se la funzione restituisce un numero intero, quando questa funzione sarà chiamata, dovrebbe essere assegnata a un intero anziché a un int al fine di evitare questo tipo di eccezione. Altrimenti sarà rischioso no? – JohnJohnGa

+1

@JohnJohnGa: Beh si. Ma presumibilmente, se il metodo restituisce "Integer" piuttosto che "int", è intenzionalmente * perché * potrebbe essere nullo. –

+0

Una variabile intera può contenere un numero naturale positivo o negativo (..., -2, -1, 0, 1, 2, ...). Il valore 0 (zero) tuttavia non è la rappresentazione corretta perché questa variabile non contenga nulla (contiene il valore 0 e solo la convenzione in un dato contesto potrebbe suggerire che 0 rappresenta "nulla" invece della rappresentazione effettiva: "niente" di "qualcosa").In molte circostanze è necessario rappresentare anche il fatto che a una variabile non è stato dato alcun valore. Questo può essere ottenuto con un tipo Nullable. Un numero nullable può essere dichiarato da un punto interrogativo (int? X). –

12

Non è possibile. Otterrete NullPointerException

+0

Dipende come puoi definire. Si compilerà con successo. – JohnJohnGa

+5

@JohnJohnGa: 'NullPointerException' si verifica in runtime. Non è sicuro che cosa intendi. Vuoi codice o codice corretto che compili? – Cratylus

6

che getterà una NullPointerException.

La ragione di questo è che vi affidate ai auto-unboxing del valore intero a un int primitivo tipo Java fa questo internamente chiamando .intValue() sull'oggetto, che è nullo

in merito a entrambi è una buona pratica o no ... vorrei sconsigliarlo, a meno che il codice non sia usato solo da te e sei estremamente ben educato, assicurandoti di assegnare solo il valore di ritorno di tale metodo ai valori Integer, non int.

Se il codice finisce in una lib utilizzata da altri, non è sicuro, e preferirei lanciare esplicitamente un'eccezione, ben documentata, e consentire la codifica difensiva da parte del chiamante.

2

Ovviamente non è possibile assegnare null a un int. Ma restituire un nulla in alcune situazioni ha senso. Null può significare che il valore non è impostato. Un tipico esempio è una colonna DB.

2

Il codice è possibile, ma genera un NullPointerException in fase di esecuzione, a causa di unboxing. Riguardo a

Significa che una funzione che restituisce un possibile valore nullo per un intero è una cattiva pratica?

sì, lo è. È inutile e pericoloso (come puoi vedere) restituire un Integer quando è sufficiente un int, perché gli oggetti possono essere nulli, mentre i primitivi non possono. Integer deve essere utilizzato solo quando necessario, come in un tipo parametrizzato - List<Integer>

1

Ciò funzionerebbe davvero.

Integer a = null; 
Integer b = a; 

Ma avrei preferito utilizzare un valore int fuori campo (-1 se i numeri sono tutti positivi) per tornare in caso di errore.

0

È un periodo di auto-boxing Java.

Integer a = null; 
int b = a; 

questo codice per assegnare un b, in realtà il compilatore farà questo: int b = a.intValue(), quindi questa linea lancerà NullPointerException;

codice:

Integer a = 1; 

effettivamente fare questo: Integer a = Integer.valueOf (1);

È possibile utilizzare javap per visualizzare le istruzioni della macchina virtuale compilate

0

È possibile scrivere semplice test:.

public class Test { 
    public static void main(String[] args){ 
     Integer a = null; 
     int b = a; 

     System.out.println(b); 
    } 
} 

e l'uscita è un NullPointerException su int b = a;

Exception in thread "main" java.lang.NullPointerException 
    at Test.main(Test.java:11) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
1

Cosa divertente con operatore Java che tiene?: (Usando 8u151 su OSX)

Se fai

Integer x = map == null ? 0 : map.get (key); 

che sembra fine e compatta e tutti, allora si ottiene un NPE !!! se

map.get (key) 

è un valore null. Quindi ho dovuto dividerlo e ha funzionato bene.

Problemi correlati