Question

Si quelqu'un appelle ma méthode, je veux défensivement traiter le problème.Habituellement, je viens de retour null.

J'ai décidé de mettre en œuvre une try catch mais il semble que je viens de finir de retour null de toute façon.

Je peux écrire mon try catch de telle sorte qu'à la fin de la méthode, il n'est pas de retour null?

Exemple de code, à l'aide de peek sur une classe de Pile.

    public T peek()
    {
        T temp = null;

        try
        {
            temp = array[size]; 
        }

        catch(Exception e)
        {
        }

        return temp;
    }

Lorsqu'elle est appelée avec une pile vide.Il sera de retour null.

Dois-je donc même pas la peine avec le try catch pour ce genre de cas?Je suis tenté de le faire:

if(isEmpty())
   return null;

Si la pile n'est pas vide, je veux le retour de l'élément.Si la pile est vide alors je peux éviter de retourner la valeur null si j'utilise le try-catch?

Était-ce utile?

La solution

La méthode doit retourner quelque chose ou lever une Exception.Si vous avez une surabondance de type générique, alors des choses comme l'objet null modèles ne peuvent pas être utilisés, de sorte que les options sont de retour null, de retour quelque chose qui contient T comme Optional<T>, ou lancer une Exception.

Si vous n'aimez pas la sécurité de null, vous pouvez utiliser Optional, soit à partir de Java 8 ou une bibliothèque.Checked exceptions ont une sécurité similaire mais qui est aussi inapproprié ici.

Autres conseils

C'est la façon dont je voudrais aborder le problème.Par la levée d'une exception dans l'œil de la fonction, en mettant le devoir de traiter cette exception en l'appelant.Pourquoi?Parce que j'ai envie d'une erreur à cause d'une explosion aussi grand que possible.La méthode lire aussi sont devenus plus petits.Aussi que vous êtes déjà d'accord sur, de retourner la valeur null est boiteux.

public T peek() throws IndexOutOfBoundsException
{   
  return array[size]; 
}

et

try
{
  T top = thestack.peek();
  /* Do something with that object */
}
catch(IndexOutOfBoundsException e)
{
  /* Do something else */
}

Il est difficile d'imaginer le array[size] lancement d'une Exception, à moins que la matrice est nulle ou de la taille est en dehors de la longueur de la matrice.Donc, vous pourriez faire quelque chose comme ça -

 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.

Modifier

Ou, à l'aide d'un Option monade - et quelque chose comme,

 if (array != null && array.length > size) {
   return new Some<T>(array[size - 1]); // assuming your size starts at 1
 }
 return new None<T>(); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top