Retornando um Array de Objeto

Boa tarde, tenho um problema que não estou conseguindo resolver que é retornar um array de objeto que exigi alguns parâmetros. Segue abaixo o método e a chamada no main:

//Método que retorna um array de objeto do tipo Imovel

public Imovel[] consultarPorTipoCidadeAreaPreco(int tipo, String cidade, double area, double preco){
		
		Imovel[] casa = new Imovel[100];
		boolean validar = true;
		
		for(int i=0; i < qtdaImoveis; i++){
			if(tipo == imoveis[i].getTipo() && imoveis[i].equals(cidade) && imoveis[i].getArea() <= area && imoveis[i].getPreco() <= preco){
				casa[contador] = imoveis[i];
				contador++;
			}
			else{
				casa[contador] = null;
			}
		}
		
		if(validar == false){
			casa = null;
			JOptionPane.showMessageDialog(null, "Não existem imóvel com essas características!!!");
		}
		
		return casa;
	}

//Trecho do código que solicita os parâmetros e imprimi os imóveis encontrados na tela.

//main
//consultar por tipo, cidade, area e preco
			case 2:{
				
				tipo = Integer.parseInt(JOptionPane.showInputDialog("Tipo do Imóvel:\n\n(1) Residencial\n(2) Comercial\n(3) Rural\n\n"));
				cidade = JOptionPane.showInputDialog("Cidade do Imóvel");
				area = Double.parseDouble(JOptionPane.showInputDialog("Área do Imóvel:"));
				preco = Double.parseDouble(JOptionPane.showInputDialog("Preço do Imóvel:"));
				Imovel[] imoveis = cad.consultarPorTipoCidadeAreaPreco(tipo, cidade, area, preco); //Aqui utiliza o método que busca os imóveis com as características informadas
				
				for(int i=0; i < cad.getContador(); i++){ //Concatena as informações dos imóveis encontrados na String saida
						saida += imoveis[i].getDescricao()+"\t"+imoveis[i].getTipo()+"" +
						"\t"+imoveis[i].getCidade()+"\t"+imoveis[i].getBairro()+"" +
						"\t"+imoveis[i].getArea()+"\t"+imoveis[i].getPreco()+"\n";
				}
				outputArea.setText(saida); //Apresenta na tela os imóveis encontrados
				JOptionPane.showMessageDialog(null, scroller, "Imóvel Cadastrado", JOptionPane.PLAIN_MESSAGE);//Conforme este código a tela aparece em branco
				
			}break;

Agradeço desde já a colaboração.

for(int i=0; i < qtdaImoveis; i++){  
            if(tipo == imoveis[i].getTipo() && imoveis[i].equals(cidade) && imoveis[i].getArea() <= area && imoveis[i].getPreco() <= preco){  
                casa[i] = imoveis[i];  
            }  
            else{  
                casa[i] = null;  
            }  
        }

Não seria assim? Pq vc não criou uma variável contador para atribuir uma posição no array.

[quote=romarcio] for(int i=0; i < qtdaImoveis; i++){ if(tipo == imoveis[i].getTipo() && imoveis[i].equals(cidade) && imoveis[i].getArea() <= area && imoveis[i].getPreco() <= preco){ casa[i] = imoveis[i]; } else{ casa[i] = null; } }

Não seria assim? Pq vc não criou uma variável contador para atribuir uma posição no array.
[/quote]

Desculpas não ter avisado antes, então todas as variáveis existentes estão previamente declaradas.

Ok, então da uma olhada no seu IF, confere com esse:

if (tipo == imoveis[i].getTipo() && imoveis[i].getCidade().equals(cidade) && imoveis[i].getArea() <= area && imoveis[i].getPreco() <= preco)

Reparou a diferença? Seu teste está sempre retornando false, então sempre cai no else.

Outra coisa, quando fizer este for:

for(int i=0; i < cad.getContador(); i++){ //Concatena as informações dos imóveis encontrados na String saida  
                        saida += imoveis[i].getDescricao()+"\t"+imoveis[i].getTipo()+"" +  
                        "\t"+imoveis[i].getCidade()+"\t"+imoveis[i].getBairro()+"" +  
                        "\t"+imoveis[i].getArea()+"\t"+imoveis[i].getPreco()+"\n";  
                }

Vc deve colocar um teste para ver se a posição não é nula, senão ira dar nullpointer, pq vc está preenchendo posições com null lá no else.

Outra dicazinha: mesmo que você queira retornar um array de alguma coisa (normalmente porque você não pode mexer na interface, ou seja, na declaração do método), trabalhe internamente com ArrayList. Você pode ver esse truque sendo usado em várias classes do próprio JDK.
Trabalhar internamente com ArrayList, e retornar um array exatamente com o tamanho certo dos seus dados, tem 3 vantagens:

a) Você não tem o limite de 100 que você impôs arbitrariamente no seu código.
b) O programa que recebe o array não precisa checar se as posições são null.
c) Não precisa ficar controlando contadores e outras coisas (talvez corretores também sejam difíceis de lidar, não?)

Vou dar um exemplo. Digamos que você queira declarar um método assim:

Imovel[] consultarImoveisQuartosPrecoBairro(int quartos, double precoMinimo, double precoMaximo, String bairro) {
     List<Imovel> imoveis = new ArrayList<Imovel>();
     // preencha sua lista de imoveis - para adicionar um novo valor, use imoveis.add (new Imovel (....
     // e por fim, para obter o array de retorno:
     return imoveis.toArray(new Imovel[0]); // truque - esse new Imovel[0] serve só para o método toArray saber 
     // exatamente o tipo do array a ser retornado e será descartado depois do uso.
}

Ola romarcio muito obrigado pelas observações, ajudou bastante, fiz algumas alterações e atingi um dos objetivos, que foi: localizar os imóveis com as características informadas. Portanto, o objetivo de informar quando nenhuma imóvel tem as respectivas características não foi atingido, que verificar se o objeto seria null, o que não estou conseguindo.

Modificações realizadas:


public Imovel[] consultarPorTipoCidadeAreaPreco(int tipo, String cidade, double area, double preco){
		
		Imovel[] casa = new Imovel[100];
		int indice = 0;
		
		for(int i=0; i < qtdaImoveis; i++){
			if(tipo == imoveis[i].getTipo() && imoveis[i].getCidade().equalsIgnoreCase(cidade) && imoveis[i].getArea() <= area && imoveis[i].getPreco() <= preco){
				casa[indice] = imoveis[i];
				indice++;				
			}
		}
		contador = indice;
			
		return casa;
	}

No main:

case 2:{
				
				tipo = Integer.parseInt(JOptionPane.showInputDialog("Tipo do Imóvel:\n\n(1) Residencial\n(2) Comercial\n(3) Rural\n\n"));
				cidade = JOptionPane.showInputDialog("Cidade do Imóvel");
				area = Double.parseDouble(JOptionPane.showInputDialog("Área do Imóvel:"));
				preco = Double.parseDouble(JOptionPane.showInputDialog("Preço do Imóvel:"));
				
				String saida = "Descricao\tTipo\tCidade\tBairro\tÁrea\tPreço\n";
				Imovel[] imoveis = cad.consultarPorTipoCidadeAreaPreco(tipo, cidade, area, preco);
				
				if(imoveis == null){//Esta condição não está funcionando
					JOptionPane.showMessageDialog(null, "Não foi localizado nenhum imóvel com estas características!!!", "Mensagem", JOptionPane.ERROR_MESSAGE);
				}else{
					for(int i=0; i < cad.getContador(); i++){
						saida += imoveis[i].getDescricao()+"\t"+imoveis[i].getTipo()+"" +
						"\t"+imoveis[i].getCidade()+"\t"+imoveis[i].getBairro()+"" +
						"\t"+imoveis[i].getArea()+"\t"+imoveis[i].getPreco()+"\n";
					}
					outputArea.setText(saida);
					JOptionPane.showMessageDialog(null, scroller, "Imóvel Cadastrado", JOptionPane.PLAIN_MESSAGE);
				}
			}break;

O teste para verificar se é null, deve ser feito dentro do FOR. Ele deve testar se a posição que vc esta percorrendo é nula ou não.

Tudo belezinha, Valeu!!!

public Imovel[] consultarPorTipoCidadeAreaPreco(int tipo, String cidade, double area, double preco){
		
		Imovel[] casa = new Imovel[100];
		int indice = 0;
		
		for(int i=0; i < qtdaImoveis; i++){
			if(tipo == imoveis[i].getTipo() && imoveis[i].getCidade().equalsIgnoreCase(cidade) && imoveis[i].getArea() <= area && imoveis[i].getPreco() <= preco){
				casa[indice] = imoveis[i];
				indice++;				
			}else{
				casa[indice] = null;
				indice++;
			}
		}
		contador = indice;
			
		return casa;
	}
case 2:{
				
				tipo = Integer.parseInt(JOptionPane.showInputDialog("Tipo do Imóvel:\n\n(1) Residencial\n(2) Comercial\n(3) Rural\n\n"));
				cidade = JOptionPane.showInputDialog("Cidade do Imóvel");
				area = Double.parseDouble(JOptionPane.showInputDialog("Área do Imóvel:"));
				preco = Double.parseDouble(JOptionPane.showInputDialog("Preço do Imóvel:"));
				
				String saida = "Descricao\tTipo\tCidade\tBairro\tÁrea\tPreço\n";
				boolean validarA = false;
				boolean validarB = false;
 				Imovel[] imoveis = cad.consultarPorTipoCidadeAreaPreco(tipo, cidade, area, preco);
				
				for(int i=0; i < cad.getContador(); i++){
					if(imoveis[i] == null){
						validarA = true;
					}else{
						validarB = true;
						saida += imoveis[i].getDescricao()+"\t"+imoveis[i].getTipo()+"" +
						"\t"+imoveis[i].getCidade()+"\t"+imoveis[i].getBairro()+"" +
						"\t"+imoveis[i].getArea()+"\t"+imoveis[i].getPreco()+"\n";
					}
				}
				if(validarA == true && validarB == false){
					JOptionPane.showMessageDialog(null, "Imóvel não localizado!!!","Mensagem", JOptionPane.ERROR_MESSAGE);
				}else{
					if(validarB == true){
					outputArea.setText(saida);
					JOptionPane.showMessageDialog(null, scroller, "Imóvel Cadastrado", JOptionPane.PLAIN_MESSAGE);
					}
				}
			}break;