¿Es posible evitar que try catch devuelva nulo?
-
21-12-2019 - |
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
?
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>();