È possibile smettere di provare a prendere il rimesso di null
-
21-12-2019 - |
Domanda
Se qualcuno chiama il mio metodo, voglio affrontare difensibilmente il problema.Di solito restituisco null
.
Ho deciso di implementare un try
catch
ma sembra che finisca prima di ritornare null
comunque.
Posso scrivere il mio try
catch
in modo tale che alla fine del metodo non restituisca null
?
Codice di esempio, utilizzando peek
su una classe Stack.
public T peek()
{
T temp = null;
try
{
temp = array[size];
}
catch(Exception e)
{
}
return temp;
}
.
se chiamato con una pila vuota.Ritornerà null
.
Quindi dovrei persino disturbare con il try
catch
per questo tipo di custodia?Sono tentato di farlo:
if(isEmpty())
return null;
.
Se lo stack non è vuoto, voglio restituire l'elemento.Se lo stack è vuoto, allora posso evitare di ritornare null se uso il try-catch
?
Soluzione
Il metodo deve restituire qualcosa o dare un'eccezione.Se si dispone di un tipo generico illimitato, non è possibile utilizzare cose come i modelli di oggetti NULL, quindi le opzioni stanno restituendo null
, restituendo qualcosa che contiene T
come Optional<T>
, o lanciare un'eccezione.
Se non ti piace la sicurezza di null
, è possibile utilizzare Optional
, da Java 8 o una libreria.Le eccezioni controllate hanno una sicurezza simile ma sono inappropriate qui.
Altri suggerimenti
Questo è il modo in cui avrei affrontato il problema.Lanciando un'eccezione nella funzione PEEK, mettendo il dovere di gestire quell'eccezione nel chiamante.Perché?Perché voglio un errore per causare un'esplosione il più grande possibile.Anche il metodo PEEK è diventato più piccolo.Anche quando sei già d'accordo, restituire Null è zoppo.
public T peek() throws IndexOutOfBoundsException
{
return array[size];
}
.
e
try
{
T top = thestack.peek();
/* Do something with that object */
}
catch(IndexOutOfBoundsException e)
{
/* Do something else */
}
. È difficile immaginare il array[size]
che lancia un'eccezione, a meno che l'array non sia nullo o la dimensione è all'esterno della lunghezza dell'array.Quindi, potresti fare qualcosa del genere -
if (array != null && array.length > size) {
return array[size - 1]; // assuming your size starts at 1
}
return null; // need to return something, if not null you need an option type.
.
Modifica
o, usando un Opzione monad - e qualcosa del genere,
if (array != null && array.length > size) {
return new Some<T>(array[size - 1]); // assuming your size starts at 1
}
return new None<T>();
.