Como deixar de dá o Return?

7 respostas
V

Galera, tenho um método que retorna um List, dentro do try claro ele vai retornar certo, no catch é obrigatório também a retornar algo, queria saber se tem como deixar de retornar ou se tiver que retornar como vou retornar um List vazio

acussa o erro na assinatura por causa disso
public List retornaLista(String nome) 
	 {
			factory = Persistence.createEntityManagerFactory("exfuncionarios");
			manager = factory.createEntityManager();
		 
		
			EntityTransaction tx = manager.getTransaction();
			tx.begin();
			try 
			{
				Query query = manager.createQuery("SELECT c FROM Cadastro c WHERE c.nome LIKE :nome%");
				query.setParameter("nome", nome);
				List<Cadastro> lista = (List<Cadastro>) query.getResultList();
				
				
				tx.commit();
								
				return lista;
			} 
			catch (RuntimeException e)
			{ 
				tx.rollback();
				JOptionPane.showMessageDialog(null,
                       "O Programa encontrou um erro!\nContacte o mantenedor do programa",
                       "Erro!",JOptionPane.ERROR_MESSAGE);
			
			}
			finally
			{
				manager.close();
				factory.close();
			}
		}

7 Respostas

_

Você nao pode deixar de retornar…

O melhor que você faz é declarar seu List fora do try, aí voce cria um e atribui valores a ele dentro do try, e retorna ele fora do try…

Se você precisar, você atribui um valor nulo pra ele no seu catch…

Desta forma, se der um erro no seu try, ele retornará null…

F

E aí Vítor. Uma boa prática de programação, é você ter SOMENTE um return nos seus métodos. Assim:

public List minhaLista(){
List lst = null;
try{
   if(true){
      lst = listaUm;
   }else{
      lst = listaDois;
    }
}catch(Exception e){
     lst = listaTres;
}

return lst;

E se vc quiser retornar uma lista vazia:

List lst = new ArrayList();

Abraço.

S

Não é verdade que o catch sempre tem que retornar algo. Se ele lançar uma exceção não tem que fazer return. Aquele código swing para dar uma mensagem ao usuário é que não deveria estar ali, e dai o problema. Ali deveria estar um throw e;
Também é discutivel só apanhar RuntimeException mas isso pode ser uma logica do seu programa por isso não digo nada.

NUNCA retorne null quando uma coleção é esperada. Retorne Collections.EMPTY_SET , Collections.EMPTY_LIST ou Collections.EMPTY_MAP conforme o caso. NUNCA crie um objeto de colecção vazia só para o poder retornar (algo como return new ArrayList()). Use SEMPRE as coleções vazias pre definidas pq são mais eficientes.

O controle de erro que mostra mensagem ao usuário deve ficar no método que chama este. E este deve lançar uma exceção se algo correu mal.

J
"sergiotaborda":
NUNCA retorne null quando uma coleção é esperada. Retorne Collections.EMPTY_SET , Collections.EMPTY_LIST ou Collections.EMPTY_MAP conforme o caso. NUNCA crie um objeto de colecção vazia só para o poder retornar (algo como return new ArrayList()). Use SEMPRE as coleções vazias pre definidas pq são mais eficientes.

Só tem um problema com EmptyList, EmptySet e afins... elas não são coleções efetivas, elas não funcionam de verdade, então, caso quem recebe o retorno do metodo tente usar a coleção ela não vai funcionar...

ex.:

public List meuMetodo(){
   return Collections.EMPTY_LIST;
}

public void outroMetodo(){
   List lista = meuMetodo();
   if(lista.isEmpty()){
     lista.add("meu objeto"); //Bang
   }
}
V

Então Jairelton para finalizar, qual seria a solução ideal??? criar um List antes do try e retornar vazio no catch???

P

e se vc criar uma exception para lista vazia? e mandar junto a msg q sera apresentada na tela, tipo: “Nenhum cadastro encontrado”

acho uma solução tranquila limpa…melhor do q lista vazia…

S

Só tem um problema com EmptyList, EmptySet e afins… elas não são coleções efetivas, elas não funcionam de verdade, então, caso quem recebe o retorno do metodo tente usar a coleção ela não vai funcionar…

Mas fazer isso não é boa prática. Não faz sentido pedir a um método que retorne uma lista e depois adicionar mais elementos a ela! Pode até ser esse o contrato do método, mas ter métodos que fazem isso não é boa prática. (Não ha separação de responsabilidade nem encapsulamento)

Mas, se for realmente necessário, vc pode usar new ArrayList(outracoleção) ou list.addAll(outracoleção) que é muito mais simples e eficiente.

Criado 14 de fevereiro de 2007
Ultima resposta 15 de fev. de 2007
Respostas 7
Participantes 6