Programa de loja de carros, dando problema com inicializacao de posicao em array

9 respostas
D
Pessoal, deem uma olhada nesse programinha que estou fazendo:
class Carro{
	private boolean ligado;

	public void setLiga(){
		ligado = true;
		System.out.println("O carro foi ligado");
	}
	public void setDesliga(){
		if(ligado){
			ligado = false;
			System.out.println("O carro foi desligado");
		}else{
			System.out.println("O carro ja esta desligado");
		}
	}
	public String getEstado(){
		if(ligado){
			return "O carro esta ligado";
		}else{
			return "O carro esta desligado";
		}
	}
}

class Loja{
	private String nome;
	private Carro[] carro = new Carro[]{};
	private int top = -1;

	public void setAddCarro(int num){
		for(int i = 0; i<num; i++){
			carro[i] = new Carro();
			top++;
		}
	}
	public void setDelCarro(int num){
		if(carro.length < 1){
			System.out.println("Voce nao tem nenhum carro para deletar");
		}else{
			for(int i = 0; i<num; i++){
				carro[top] = null;
				top--;
			}
		}
	}
	public String getQuantCarro(){
		if(carro.length < 1){
			return "Nao temos carro";
		}else{
			return "Temos " + top + " carros";
		}
	}
}
public class Teste{
	public static void main(String[] args){
		Loja loja = new Loja();
		loja.setAddCarro(5);
		loja.getQuantCarro();
	}
}
Bom, o probleminha disso tudo esta nas seguintes partes:
private Carro[] carro = new Carro[]{};
Onde eu quero apenas iniciar uma array do tipo Carro para depois, em um metodo instanciar a array da seguinte forma:
public void setAddCarro(int num){
		for(int i = 0; i<num; i++){
			carro[i] = new Carro();
			top++;
		}
	}
Ja tentei varias saidas, mas nenhuma deu certo. Ja tentei deichar a criacao da array do tipo carro apenas assim:
Carro[] carro;
E depois deichar o metodo assim para iniciar a instancia:
public void setAddCarro(int num){
		for(int i = 0; i<num; i++){
			carro = new Carro();
			top++;
		}
	}
Mas nada tem dado certo. Eu estou com uma plataforma pecima para programar e achar erros, por isso estou pedindo ajuda. Estou programando em bloco de notas e compilando no: http://www.innovation.ch/java/java_compile.html por isso quero pedir ajuda de alguem que esteje numa situacao melhor! :lol:

Antes ele dava o erro de nullPoiterException, ai eu mudei o metodo e ele compilou mas deu um erro em tempo de execucao de falta de tamanho da array. Alguem poderia me ajudar?
Vlw

9 Respostas

D

Bom, acabei cometendo um errinho:

public String getQuantCarro(){  
         if(carro.length < 1){  
             return "Nao temos carro";  
         }else{  
             return "Temos " + top + " carros";  
         }  
     }

Eu mudei esse metodo para um void que usava o System.out.println() para mostrar a quantia de carros e iniciei o array assim:

Carro[] carro = new Carro[100];

Ai eu poderia ter ate 100 carros. Tudo deu perfeito mas eu me dei de conta que eu nao estava manipulando o array da maneira esperada e sim mostrando o conteudo da variavel top. O metodo getQuantCarro() deveria mostrar a quantia de arrays instanciadas, algo como:

System.out.println(carro.length);

E para isso eu nao poderia iniciar as posicoes da array e sim " ir instanciando" aos poucos conforme eu chamo o metodo.
Alguem tem uma ideia?

thundercas

Cara, eu não entendi bem a sua dúvida não… Você pode sim definir sua array com 100 posições e depois percorre-la até que o conteúdo da próxima posição seja nulo…

O método “array”.next() já faz isso para você.

D

Como funciona esse metodo array.next? :shock: Tem um exemplo?
E eu queria nao ter que criar as 100 posicoes, queria ir “criando” conforme vou chamando o metodo para Adicionar Carros. Isso e possivel com arrays ou so com outros tipos de collections tipo ArrayList?

fantomas

Não sei se entendi direito, mas vou responder mesmo assim rsrssrs.

As alterações que eu achei que poderiam melhorar um pouco mais o teu código estão apontados abaixo.
class Loja{
        private static final NUM_MAX_CARRO = 100; // <------<< a) Alterei aqui
	private String nome;
	private Carro[] carros = new Carro[NUM_MAX_CARRO]; // <------<< b) Alterei aqui
	private int top = -1;

	public void addCarros(int num){   // <------<< c) Alterei aqui
		if( num >= 0 && num < NUM_MAX_CARRO ) { // <------<< d) Alterei aqui
		  for(int i = 0; i<num; i++){
			carros[i] = new Carro(); // <------<< e) Alterei aqui
			top++;
		  }
		}
	}


	public void delCarros(int num){ // <------<< f) Alterei aqui
		if( num >= 0 && num < NUM_MAX_CARRO ) { // <------<< g) Alterei aqui
			for(int i = 0; i<num; i++){
				carros[top] = null;
				top--;
			}
		} else {
			System.out.println("Voce nao tem nenhum carro para deletar");
		}

	}


	public String getQuantCarros(){ // <------<< h) Alterei aqui
		if(top < 0){ // <------<< i) Alterei aqui
			return "Nao temos carro";
		}else{
			return "Temos " + top + " carros";
		}
	}

}
public class Teste{
	public static void main(String[] args){
		Loja loja = new Loja();
		loja.addCarros(5); // <------<< j) Alterei aqui
		loja.getQuantCarros(); // <------<< k) Alterei aqui
	}
}

Para percorrer a lista de carros vc poderia fazer assim:

for( Carro carro : carros ) {
   System.out.println( " >> "+carro.getEstado() );
}

flws

D

Ainda nao e bem isso. Eu nao queria criar uma array com uma quantidade de posicoes definidas. Ali, vc criou uma constante com valor 100. Eu nao quero usar constantes, eu quero criar uma array sem um limite de posicoes definidas :shock:
Eu quero ir criando novas posicoes conforme eu chamo o metodo addCarros(). Tem como sem ter que usar uma collection tipo arrayList?

T

Qual o problema em usar collections??

D

Simplesmente quero ter maior controle sobre a performace do meu programa. Sei que essa performace nao e consideravel, mas gostaria de saber fazer diferente.

T

A diferença de tempo gasto entre o uso de um ArrayList e de um array da linguagem é desprezível em condições normais, uma vez que o ArrayList é implementado usando-se um array como base; como você deve ter percebido, o controle da alocação de um array (necessário quando você não sabe de antemão quantos elementos você vai ter) é bem chato, e é melhor usar um ArrayList porque esse controle já foi pensado, feito, debugado e testado pela Sun.

fantomas

:shock: What the hell?!?!

Criado 10 de novembro de 2008
Ultima resposta 12 de nov. de 2008
Respostas 9
Participantes 5