Mi domando...davvero so <code>null</code>(a)?

Posted by Lucio Benfante Fri, 03 Nov 2006 16:00:00 GMT

“La vera saggezza sta in colui che sa di non sapere! Perchè io so di sapere più di te, che pensi di sapere.” (Socrate) Allora i programmatori Java dovrebbero essere molto saggi, perchè dovrebbero essere convinti di (non) conoscere null molto bene. Ma siamo così sicuri?

Domanda 1: Di che tipo è il litteral null?

qui prossimamente la risposta

Domanda 2: Assegnando il litteral null ad una variabile, devo fare un cast esplicito?

qui prossimamente la risposta

Domanda 3: C’è qualche caso in cui ha senso fare un cast esplicito di un litteral null?

qui prossimamente la risposta

Domanda 4: Assegnando il litteral null ad una variabile, posso aspettarmi una ClassCastException?

qui prossimamente la risposta

Domanda 5: Può accadere una NullPointerException assegnando un valore ad una variabile di un tipo primitivo?

qui prossimamente la risposta

…altre? Se conoscete qualche stranezza riguardante il null(a)…scrivete…scrivete…

Hey! Ma che razza di post è questo? L’idea è di dare degli argomenti di discussione legati principalmente alla conoscenza delle basi del linguaggio Java.

Da tali discussioni deriverà sicuramente una migliore conoscenza di alcuni aspetti di base del linguaggio, necessari, ad esempio, per superare le certificazioni Programmer e Developer, ma anche, magari, per programmare un po’ meglio.

Quindi, commentate…commentate…Chi darà la risposta megliore se la vedrà riportata sopra (o eventualmente un mix delle risposte migliori), con ovviamente il riconoscimento della paternità, o maternità, nel caso delle gentili signore che vorranno cimentarsi.

Posted in  | Tags , ,  | 9 comments

Comments

  1. Avatar Lucio Benfante said 14 days later:

    Ciao beppegg.

    In merito alla domanda 4, tu hai risposto “no”. Ma vale anche nel caso di un cast esplicito?

    La domanda 5 invece merita un approfondimento…sei davvero sicuro che non possa avvenire? (Suggerimento: Java 5 e autobox-unbox…) :)

  2. Avatar beppegg said 15 days later:

    Domanda 1: Di che tipo è il literal null?

    null è un valore polimorfico, ovvero ha conversioni definite per tutte le classi in Java. Tant’è che lo si può assegnare a qualunque variabile, senza dover fare conversioni esplicite. :D

    In dettaglio, appartiene ad un tipo particolare (il tipo null, appunto), che non ha un nome assegnato, e che quindi non può essere referenziato dai progammatori.

    Domanda 2: Assegnando il litteral null ad una variabile, devo fare un cast esplicito?

    Come detto prima, no: il literal null ha conversioni implicite in tutti i tipi.

    Domanda 3: C’è qualche caso in cui ha senso fare un cast esplicito di un litteral null?

    Si. supponiamo di avere i metodi in overload:

    public void doSomething(String par1) { ... }

    public void doSomething(Integer par1) { ... }

    se dovessi invocare “doSomething(null)”, il compilatore non avrebbe modo di disambiguare la chiamata, dal momento che null può essere convertito implicitamente in entrambi i tipi String ed Integer. In questo caso, occorre specificare esplicitamente a “che tipo” di null si fa riferimento, ad esempio scrivendo “doSomething((String) null)”

    Domanda 4: Assegnando il litteral null ad una variabile, posso aspettarmi una ClassCastException?

    No

    Domanda 5: Può accadere una NullPointerException assegnando un valore ad una variabile di un tipo primitivo?

    No

  3. Avatar Stefano said 489 days later:

    Ciao a tutti da Bologna ;)

    Domanda 5: Può accadere una NullPointerException assegnando un valore ad una variabile di un tipo primitivo?

    In Java 5 può succedere long primitivo = 0; Long obj = null;

    -

    primitivo = obj //NullPointerException

    immagino xchè sotto sotto la jvm provi a chiamare obj.longValue();

    Saluti

  4. Avatar Lucio Benfante said 490 days later:

    Ciao Stefano, sì, accade perchè in Java 5 sono stati introdotti l’auto-boxing e l’auto-unboxing, cioè la capacità del compilatore di trasformare automaticamente un tipo primitivo in un’istanza della corrispondente classe wrapper, e viceversa.

    Ovviamente il valore da trasformare nell’auto-unboxing deve essere valido per il tipo primitivo, e dato che null non lo è, viene sollevata una NullPointerException.

    E’ opportuno sottolineare quello che dice anche la documentazione Sun:

    http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html

    “Use them only when there is an “impedance mismatch” between reference types and primitives, for example, when you have to put numerical values into a collection. It is not appropriate to use autoboxing and unboxing for scientific computing, or other performance-sensitive numerical code. An Integer is not a substitute for an int; autoboxing and unboxing blur the distinction between primitive types and reference types, but they do not eliminate it.”

    ...non vi ricorda la faccenda della concatenazione delle String, che penalizza le prestazioni delle applicazioni dei programmatori meno esperti? Occhio quindi ad abusare di questa “feature”! :)

  5. Avatar masters dissertation sample help said 2245 days later:

    I could tell how great you are in your field of interest.

  6. Avatar geebranz said 5452 days later:

    Basic aspects

    average bathroom remodel cost

  7. Avatar geebranz said 5452 days later:

    Less experienced

    small kitchen remodel

  8. Avatar baby photography said 5454 days later:

    Cant believe this article made soo much sense now. You really have a talent for this! Continue pressing on!

  9. Avatar baby photography said 5454 days later:

    This is such a great help! I’ve been struggling for days already, soo glad i found this site! thanks for sharing!

(leave url/email »)

   Comment Markup Help Preview comment