Problemas com iteradores

Alguém me pode/consegue explicar por que razão este troço de código não me diz “This method must return a result of type Veiculo” quando tenho o código a retornar um objecto do tipo veiculo ? Será da implementação dos meus iteradores ??


public static Veiculo obtemVeiculo(String matricula){
		Iterator<Veiculo> iter = _veiculos.iterator();
		while (iter.hasNext()){
			Veiculo veic = iter.next();
			if (matricula == veic.obtemMatricula())
				return veic;
			else iter.next(); 
		}
	}

Obrigado, Cláudio R.

Esqueci-me de mencionar:


private static List<Veiculo> _veiculos;

_veiculos é uma ArrayList

Alguém me dá uma ajudinha ?

Faça assim:

[code]public static Veiculo obtemVeiculo(String matricula) {
Iterator iter = _veiculos.iterator();
Veiculo result = null;

while (iter.hasNext()) {   
        Veiculo veic = iter.next();   
        if (matricula == veic.obtemMatricula()) {
            result = veic;   
            break;
        }
        else iter.next();   
    }   
return result;
}  [/code]

T+

[quote=diego2005]Faça assim:

[code]public static Veiculo obtemVeiculo(String matricula) {
Iterator iter = _veiculos.iterator();
Veiculo result = null;

while (iter.hasNext()) {   
        Veiculo veic = iter.next();   
        if (matricula == veic.obtemMatricula()) {
            result = veic;   
            break;
        }
        else iter.next();   
    }   
return result;
}  [/code]

T+[/quote]

Em complemento à resposta do Diego:

No seu código (dentro do laço) você está dizendo: “Pegue o próximo veículo da lista e atribua a veic. Se a matrícula dada como parâmetro for igual à de veic, retorne veic. Senão, vá para o próximo veículo da lista.”.
Minhas considerações:

1 - O compilador estava reclamando que o método não estava retornando nada porque, apesar de você estar retornando algo, você está o fazendo dentro de um bloco de condição (if). Entretanto é possível que a matrícula de nenhum dos veículos da lista seja igual à dada como parâmetro. No código atual, você não retorna nada nessa situação. O exemplo dado pelo Diego resolve esse problema.

2 - Você está chamando duas vezes, dentro do mesmo laço, o método next() do Iterator iter. Com essa chamada, você está comparando os veículos de dois em dois, ou seja, se a lista tiver 5 veículos, você somente comparará os veículos das posições 0, 2 e 4 da lista. É esse o comportamento que você deseja que ocorra nessa iteração?

3 - Na comparação de Strings, é aconselhável a utilização do método equals().

Segue a minha sugestão de código, conforme as considerações acima:

public static Veiculo obtemVeiculo(String matricula){  
    Iterator<Veiculo> iter = _veiculos.iterator();  
    Veiculo veic = null;

    while (iter.hasNext()){  
        veic = iter.next();  
        
        if (matricula.equals(veic.obtemMatricula()))  
            break;  
    }  

    return veic;
}