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?

È stato utile?

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>(); 
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top