É possível parar de tentar pegar de retornar null
-
21-12-2019 - |
Pergunta
Se alguém chama meu método, eu quero defensivamente lidar com o problema.Geralmente eu só retorno null
.
Decidi implementar um try
catch
mas parece que eu só acaba voltando null
de qualquer maneira.
Eu posso escrever o meu try
catch
de tal forma que no final do método não retornar null
?
Código de exemplo, usando peek
em uma Pilha de classe.
public T peek()
{
T temp = null;
try
{
temp = array[size];
}
catch(Exception e)
{
}
return temp;
}
Quando chamado com uma pilha vazia.Ele vai voltar null
.
Então eu devo mesmo me preocupar com as try
catch
para este tipo de caso?Estou tentado a fazer isso:
if(isEmpty())
return null;
Se a pilha não estiver vazia eu quero retornar o elemento.Se a pilha é vazio, então eu posso evitar retornar null se eu usar o try-catch
?
Solução
O método tem de devolver algo ou lançar uma Exceção.Se você tem um unbounded tipo genérico e, em seguida, coisas como objeto nulo padrões não podem ser usados, portanto, as opções estão voltando null
, voltando algo que contém T
como Optional<T>
, ou lançar uma Exceção.
Se você não gosta de segurança de null
, você pode usar Optional
, quer a partir do Java 8 ou uma biblioteca.Verificada exceções ter uma segurança semelhante, mas são inadequados aqui.
Outras dicas
Isto é como eu iria abordar o problema.Lançando uma exceção na função de observação, colocando o dever de tratamento de exceção em que o chamador.Por quê?Porque eu quero um erro para causar uma explosão tão grande quanto possível.O método peek também tornou-se menor.Também como você já acordar, retornando null é coxo.
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 */
}
É difícil imaginar o array[size]
lançando uma Exceção, a menos que a matriz é nulo ou tamanho está fora do comprimento da matriz.Então, você poderia fazer algo assim -
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
Ou, usando uma Opção monad - e 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>();