2012-12-17 14 views
15

Wenn der folgende Code ist möglich:Zuweisen eines Nullwert in einen int

Integer a = null; 
int b = a; 

Bedeutet es, dass eine Funktion eine mögliche null Wert für eine ganze Zahl ist eine schlechte Praxis zurückkehrt?

Bearbeiten 1: Es gibt verschiedene Meinungen in diesen Antworten. Ich bin nicht genug zuversichtlich, das eine oder andere zu wählen.

+5

Tony Hoare, der Erfinder von Null, nennt es seinen Milliarden Dollar Fehler. Vermeiden Sie generell "null". –

+0

Es ist keine schlechte Übung, wenn Sie wissen müssen, dass der Wert unbekannt ist. Die Ausnahmebehandlung für 'NullPointerException' kann in Ihren Code integriert werden, um die Abwesenheit widerzuspiegeln, den NULL INT in eine Null umzuwandeln, usw. [NULL] (http://en.wikipedia.org/wiki/Null_%28SQL%29) ist ein notwendiges Übel, gibt es Fälle, in denen Sie eine unbekannte oder fehlende Wert klar identifizieren müssen, wie: wie oft werde ich heiraten, Datum des Todes, usw. –

+0

@ TomHawtin-Tackline so alles, was wir wissen ist, dass er war falsch, zumindest einmal, wenn das nicht nur zur Debatte stand, sondern auch off-topic. Wenn man bedenkt, dass es sich bei dieser Frage nicht um Sprachdesign handelt und null ist ein sehr wesentlicher Bestandteil von Java, der besagt, dass der Glaube eines Sprachdesigners auch nicht hilfreich ist. – josefx

Antwort

38

Dieser Code wird eine NullPointerException geben, wenn Sie es ausführen. Es entspricht im Wesentlichen:

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

... was es klarer macht, dass es tatsächlich fehlschlagen wird.

Sie sind nicht wirklich Zuweisen eines Nullwerts zu einem int - Sie versuchen und scheitern.

Es ist in Ordnung null als Wert für Integer zu verwenden; in der Tat oft Integer statt int gerade als „nullable-Äquivalenten verwendet.

+0

Wenn Ihre Funktion eine Ganzzahl zurückgibt, dann sollte diese Funktion, wenn diese Funktion aufgerufen wird, einer Ganzzahl anstelle einer Ganzzahl zugewiesen werden, um diese Art von Ausnahme zu vermeiden. Sonst ist es riskant nein? – JohnJohnGa

+1

@JohnJohnGa: Nun ja. Aber vermutlich, wenn die Methode "Integer" anstatt "int" zurückgibt, ist dies absichtlich * weil * es null sein könnte. –

+0

Eine Integer-Variable kann eine positive oder negative natürliche Zahl enthalten (..., -2, -1, 0, 1, 2, ...). Der Wert 0 (Null) ist jedoch nicht die korrekte Darstellung für diese Variable, die nichts enthält (sie enthält den Wert 0 und nur die Konvention in einem gegebenen Kontext könnte vorschlagen, dass 0 "nichts" anstelle der tatsächlichen Darstellung darstellt: "nichts" von "etwas").In vielen Fällen ist es erforderlich, auch die Tatsache darzustellen, dass eine Variable überhaupt keinen Wert erhalten hat. Dies kann mit einem Nullable Type erreicht werden. Eine nullwertfähige Ganzzahl kann mit einem Fragezeichen (int? X) deklariert werden. –

12

Es ist nicht möglich. Sie erhalten NullPointerException

+0

Abhängig davon, wie Sie es definieren. Es wird erfolgreich kompiliert. – JohnJohnGa

+5

@JohnJohnGa: "NullPointerException" tritt in der Laufzeit auf.Nicht sicher, was Sie meinen.Wollen Sie den richtigen Code oder Code, der kompiliert? – Cratylus

6

, dass eine Nullpointer werfen.

Der Grund dafür ist, dass Sie auf Auto-Unboxing des Integer-Wert ein angewiesen sind int primitive Art. Java tut dies, indem intern .intValue() auf dem Objekt aufgerufen wird, das Null ist

Ob es eine gute Praxis ist oder nicht ... Ich würde davon abraten, es sei denn, der Code wird nur von Ihnen verwendet und Sie sind extrem gut benommen, stellen Sie sicher, dass Sie den Rückgabewert einer solchen Methode nur den Integer-Werten zuweisen, nicht int.

Wenn Ihr Code in einer von anderen verwendeten Lib endet, ist es nicht sicher, und ich würde lieber explizit eine Exception auslösen, die gut dokumentiert ist und eine defensive Codierung auf Seiten des Anrufers erlaubt.

2

Natürlich können Sie einem int keinen Null zuweisen. In manchen Situationen ist es jedoch sinnvoll, eine Null zurückzugeben. Null kann bedeuten, dass der Wert nicht gesetzt ist. Ein typisches Beispiel ist eine DB-Spalte.

2

Der Code ist möglich, aber wirft einen NullPointerException zur Laufzeit wegen Unboxing. Betreff

Bedeutet es, dass eine Funktion, die einen möglichen Nullwert für eine Ganzzahl zurückgibt, eine schlechte Übung ist?

ja, ist es. Es ist nutzlos und gefährlich (wie Sie sehen können), eine Integer zurückzugeben, wenn ein int genug ist, weil Objekte null sein können, während primitive nicht können. Integer sollte nur bei Bedarf verwendet werden, wie in einem parametrierten Typ - List<Integer>

1

Das würde in der Tat funktionieren.

Integer a = null; 
Integer b = a; 

Aber ich würde lieber einen int-Wert außerhalb des Bereichs verwenden (-1, wenn Ihre Zahlen alle positiv sind) im Falle eines Fehlers zurück.

0

Es ist ein Java-Auto-Boxen.

Integer a = null; 
int b = a; 

Dieser Code zuordnen zu b, tatsächlich wird der Compiler dies tun: int b = a.intValue(), so wird diese Linie Nullpointer werfen;

der Code:

Integer a = 1; 

wird dies tatsächlich tun: Integer a = Integer.valueOf (1);

können Sie verwenden javap die kompilierten virtuellen Maschinenbefehle zu sehen

0

Sie können einfacher Test schreiben.

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

     System.out.println(b); 
    } 
} 

Und der Ausgang ist ein Nullpointer auf 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

Lustige Sache mit Java tenerary operator?: (Mit 8u151 auf OSX)

Wenn Sie

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

tun, was gut und kompakt und alles scheint, dann erhalten Sie eine NPE !!! if

map.get (key) 

ist ein Nullwert. Also musste ich das teilen und es hat gut funktioniert.

Verwandte Themen