Pregunta

Si alguien llama a mi método, quiero abordar el problema a la defensiva.normalmente solo regreso null.

Decidí implementar un try catch pero parece que termino regresando null de todos modos.

¿Puedo escribir mi try catch de tal manera que al final del método no regresa null?

Código de muestra, usando peek en una clase de pila.

    public T peek()
    {
        T temp = null;

        try
        {
            temp = array[size]; 
        }

        catch(Exception e)
        {
        }

        return temp;
    }

Cuando se llama con una pila vacía.volverá null.

Entonces, ¿debería siquiera molestarme con el try catch para este tipo de casos?Estoy tentado a hacer esto:

if(isEmpty())
   return null;

Si la pila no está vacía, quiero devolver el elemento.Si la pila es vacío, entonces ¿puedo evitar devolver nulo si uso el try-catch?

¿Fue útil?

Solución

El método tiene que devolver algo o lanzar una excepción.Si tiene un tipo genérico ilimitado, entonces no se pueden usar elementos como patrones de objetos nulos, por lo que las opciones regresan null, devolviendo algo que contiene T como Optional<T>, o lanzar una excepción.

Si no te gusta la seguridad de null, puedes usar Optional, ya sea desde Java 8 o una biblioteca.Las excepciones marcadas tienen una seguridad similar pero son inapropiadas aquí.

Otros consejos

Así es como me acercaría al problema.Lanzando una excepción en la función PEEK, poniendo el deber de manejar esa excepción en la persona que llama.¿Por qué?Porque quiero un error para causar una explosión lo más grande posible.El método de peek también se hizo más pequeño.También a medida que ya está de acuerdo, regresando Null es cojo.

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

y

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

Es difícil imaginar el array[size] lanzando una excepción, a menos que la matriz sea nula o el tamaño esté fuera de la longitud de la matriz.Entonces, podrías hacer algo como esto:

 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.

Editar

O, usando un Opción mónada - y algo como,

 if (array != null && array.length > size) {
   return new Some<T>(array[size - 1]); // assuming your size starts at 1
 }
 return new None<T>(); 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top