2014-12-16 21 views
12

Dopo aver controllato il JavaDocs per un metodo che stavo pensando di utilizzare, requiredNonNull, mi sono imbattuto nel primo con il singolo parametro (T obj).Qual è lo scopo degli oggetti # requireNonNull

Tuttavia qual è lo scopo effettivo di questo particolare metodo con questa firma? Tutto ciò che fa semplicemente è gettare e NPE che sono alquanto positivo (come potrei mancare qualcosa di ovvio qui) verrebbe comunque lanciato.

Produce: NullPointerException - se obj è null


Quest'ultimo rende effettivamente senso in termini di debug certo codice, come il doc afferma inoltre, è progettato principalmente per la convalida dei parametri

public static <T> T requireNonNull(T obj,String message)

Verifica che il riferimento all'oggetto specificato non sia null e genera una NullPointerException personalizzata, se lo è.

Quindi posso stampare informazioni specifiche insieme a NPE per rendere il debug molto più semplice.


Con questo in mente dubito fortemente che mi piacerebbe imbattersi in una situazione in cui preferirei invece usare il primo invece. Per favore, illuminami.

tl; dr - Perché dovresti usare il sovraccarico che non accetta un messaggio.

+0

Qual è la tua domanda attuale? Hai già risposto tu stesso alla domanda che hai posto nel titolo. – Radiodef

+0

@Radiodef Sotirios Delimanolis lo ha sintetizzato meglio: "Penso che la domanda, dal corpo, è perché dovresti usare il sovraccarico che non richiede un messaggio". – Juxhin

+0

Dovresti modificare la tua domanda per chiarire in seguito. – Radiodef

risposta

25

Un buon principio durante la scrittura del software consiste nel rilevare gli errori il prima possibile. Più velocemente si nota, ad esempio, un valore errato come null passato a un metodo, più facile è scoprire la causa e risolvere il problema.

Se si passa null ad un metodo che non dovrebbe ricevere null, un NullPointerException probabilmente accadrà da qualche parte, come già notato. Tuttavia, l'eccezione potrebbe non accadere fino a pochi metodi più in basso, e quando accade da qualche parte in profondità, sarà più difficile trovare la fonte esatta dell'errore.

Quindi, è meglio quando i metodi controllano i loro argomenti in primo piano e generano un'eccezione non appena trovano un valore non valido come null.

modifica - Circa la versione a un parametro: anche se non fornirà un messaggio di errore, il controllo e argomenti un'eccezione presto sarà più utile che lasciare il passo null verso il basso fino un'eccezione accade da qualche parte più in profondità . La traccia dello stack indicherà la linea in cui è stato utilizzato Objects.requireNonNull(...) e dovrebbe essere evidente a te come sviluppatore che significa che non devi passare null. Quando si attiva uno NullPointerException implicitamente, non si sa se il programmatore originale avesse l'intento che la variabile non fosse null.

+1

Penso che la domanda, dal corpo, sia perché dovresti usare il sovraccarico che non accetta un messaggio. –

+0

Sono totalmente d'accordo sul principio di rilevare gli errori il prima possibile, ma lanciare una NullPointerException suona strano per me. Se hai bisogno di tempo per controllarlo, presumo che potresti lanciare un'eccezione più amichevole come InvalidParmeterException o qualcosa del genere. – RLM

+1

@RaphaelMoita L'eccezione standard per indicare che un argomento non è valido è 'IllegalArgumentException'. I progettisti di 'Objects.requireNonNull (...)' hanno scelto di usare 'NullPointerException' invece ... – Jesper