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?

Foi útil?

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>(); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top