NullPointerException com array [Resolvido]

Pessoal, boa tarde

Estou fazendo um exercicio de cadastro de produto com venda e compra…

E ai montei o codigo todo separado em classes mas agora nao ta dando certo

Criei a classe dos produtos…

So não vou postar os metodos getters e setters para não encher a pagina


public class Produto {

	private int codigo;
	private String produto;
	private String descricao;
	private float estoque;
	private float quantidade_Entrada;
	private float quantidade_Saida;

E classe main é onde rodo o programa…


	public static void main(String[] args) throws ExcessaoCodigoInvalido,
			ExcessaoVenda, ExcessaoQuantidadeProduto {

		Produto produto[] = new Produto[10];
		
		for (int i = 0; i < produto.length; i++) {
			produto[i].setQuantidade_Entrada(0);
		}

		int op = 0;

		do {
			op = Menu.menu_Principal();
			switch (--op) {
			case 0:
				CadastroProduto.cadastrarProduto(produto);
				break;
			case 1:
				AlterarProduto.alterarProduto(produto);
				break;
			case 2:
				CompraProduto.comprarProduto(produto);
				break;
			case 3:
				VendaProduto.venderProduto(produto);
				break;
			case 4:
				ProdutoRelatorio.relatorio(produto);
				break;
			case 5:
				System.out.println("Programa finalizado");
				;
				break;
			default:
				System.out.println("Código invalido");
				break;
			}
		} while (op != 5);

	}

}

Mas ao rodar ele acuso nullpointerexception

No caso eu la no alto eu apenas rodo aquele laço de teste mas esta dando esse erro, como resolver?

Obrigado

Então o erro está dando em qual linha ??

Tente colocar assim:

[code]Produto produto[] = new Produto[10];
for (int i = 0; i < produto.length; i++) {
produto[i] = new Produto();
produto[i].setQuantidade_Entrada(0);

	}[/code]

Eu posso estar errado mas o seu Array estava vazio, ai quando você tentava se referenciar a um objeto dentro dele ele dava erro porque ele estava null.

[quote=Sem_Nome]Tente colocar assim:

[code]Produto produto[] = new Produto[10];
for (int i = 0; i < produto.length; i++) {
produto[i] = new Produto();
produto[i].setQuantidade_Entrada(0);

	}[/code]

Eu posso estar errado mas o seu Array estava vazio, ai quando você tentava se referenciar a um objeto dentro dele ele dava erro porque ele estava null.[/quote]

[code]Produto produto[] = new Produto[10];
for (int i = 0; i < produto.length; i++) {
produto[i] = new Produto(); //esse aqui ó
produto[i].setQuantidade_Entrada(0);

	}[/code]

Cara pq isso? aonde eu indique no código

Entende que esta sendo chamado o método construtor da classe produto naquele daquela posição…

Mas isso ja n seria feito pelo codigo implictamente?

Obrigado

Não… você define um array que terá 10 instancias da classe Produto.

mas até aí só o array foi definido, as posições vem todas nulas… enquanto você não associar uma instância à ela, ela permanece nula

[quote=macario1983][quote=Sem_Nome]Tente colocar assim:

[code]Produto produto[] = new Produto[10];
for (int i = 0; i < produto.length; i++) {
produto[i] = new Produto();
produto[i].setQuantidade_Entrada(0);

	}[/code]

Eu posso estar errado mas o seu Array estava vazio, ai quando você tentava se referenciar a um objeto dentro dele ele dava erro porque ele estava null.[/quote]

[code]Produto produto[] = new Produto[10];
for (int i = 0; i < produto.length; i++) {
produto[i] = new Produto(); //esse aqui ó
produto[i].setQuantidade_Entrada(0);

	}[/code]

Cara pq isso? aonde eu indique no código

Entende que esta sendo chamado o método construtor da classe produto naquele daquela posição…

Mas isso ja n seria feito pelo codigo implictamente?

Obrigado

[/quote]

Você instanciou o Array, não me lembro bem mas o metodo construtor padrão é deixar todos os atributos objetos apontando para null, int sendo igual a 0, boolean como falso, etc…portanto todos os objetos dentro do seu Array estariam apontando para null.

É claro que eu posso estar falando alguma besteira, mas eu tenho quase certeza que o que eu disse está certo :smiley:

bom entao para eu ter um entendimento melhor

pq eu so havia trabalhado com arrays de tipos primitivos e sou novo em java

entao quando um usar tipo referencia a determinada classe devo instanciar com o construtor da classe aonde ficam os atributos…

obrigado

os elementos do seu array por default são null e vc não pode manipular um valor null. e vc está fazendo isso. Na linha 7 do seu código.

Faz o que o Sem_Nome falou que vai passar.

tipos primitivos são diferentes dos objetos. Quando vc tem um array que não é primitivo os elementos do array, vão possuir uma referencia para null. Com primitivo, os elementos terão um valor padrão com base no tipo. Se for um int é 0, por exemplo.

[quote=LPJava]os elementos do seu array por default são null e vc não pode manipular um valor null. e vc está fazendo isso. Na linha 7 do seu código.

Faz o que o Sem_Nome falou que vai passar.

tipos primitivos são diferentes dos objetos. Quando vc tem um array que não é primitivo os elementos do array, vão possuir uma referencia para null. Com primitivo, os elementos terão um valor padrão com base no tipo. Se for um int é 0, por exemplo. [/quote]

eu fiz isso e deu certim…

mas so queria entender…

o funcionamento disso

No caso vc está trabalhando com um objeto Produto e vc especificou que seu array tera objetos do tipo Produto, então vc cria um objeto produto e coloca esse objeto dentro do seu array…

ok mas para nivel de codigo…

para realmente criar cada objeto em codigo

eu devo realmente fazer isso


		for (int i = 0; i < produto.length; i++) {
			produto[i] = new Produto();
		}

ou eu devo fazer isso na propria classe produto por exemplo?

qual seria o metodo correto…

ou o acima é o metodo que se utiliza na criação do objeto

[quote=macario1983]ok mas para nivel de codigo…

para realmente criar cada objeto em codigo

eu devo realmente fazer isso


		for (int i = 0; i < produto.length; i++) {
			produto[i] = new Produto();
		}

ou eu devo fazer isso na propria classe produto por exemplo?

qual seria o metodo correto…

ou o acima é o metodo que se utiliza na criação do objeto[/quote]

Nao entendi a sua pergunta.

Para preencher o array você precisa criar esse loop. Lembre-se que voce nao precisa completar o array para comecar a utiliza-lo, voce apenas precisa ter um objeto que nao esteja apontando para null na posicao que voce esta tentando acessar.

So uma sugestao: use ArrayList. Ja que voce esta comecando, vai ser muito mais facil pois ai voce nao precisa se preoculpar com o tamanho do seu Array :smiley:

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html

Criando um ArrayList:

ArrayList<SuaClasse> lista = new ArrayList<SuaClasse>();

Adicionando um elemento:

lista.add(objeto);

Pegando o objeto na lista, onde i é a variavel do loop:

lista.get(i);

Acessando um atributo ou metodo de um objeto dentro da lista, onde i é a variavel do loop:

lista.get(i).setQuantidade_Entrada(0);

Descobrir o tamanho da lista:

lista.size();

Essas sao as coisas que voce mais ira usar com um ArrayList.

Lembre-se que O ArrayList não tem um tamanho fixo.

caro amigo do post de cima agradeço sua ajuda…

seguinte, estou no capitulo 7 do livro do Deitel e na aula ainda n vi arraylist ou seja colections

espero daqui a pouco começar ja a usar mais facilidades do java

Eu ja usei Delphi e tinha StringLista que tem a msm ideia assim do ArrayList…

Minha pergunta era a seguinte…

Nao teria como eu colocar no construtor da classe aquele trecho de codigo para nao fazer aquele loop?

Valeu

[quote=macario1983]caro amigo do post de cima agradeço sua ajuda…

seguinte, estou no capitulo 7 do livro do Deitel e na aula ainda n vi arraylist ou seja colections

espero daqui a pouco começar ja a usar mais facilidades do java

Eu ja usei Delphi e tinha StringLista que tem a msm ideia assim do ArrayList…

Minha pergunta era a seguinte…

Nao teria como eu colocar no construtor da classe aquele trecho de codigo para nao fazer aquele loop?

Valeu[/quote]

Tenho quase certeza que nao.

[quote=Sem_Nome][quote=macario1983]caro amigo do post de cima agradeço sua ajuda…

seguinte, estou no capitulo 7 do livro do Deitel e na aula ainda n vi arraylist ou seja colections

espero daqui a pouco começar ja a usar mais facilidades do java

Eu ja usei Delphi e tinha StringLista que tem a msm ideia assim do ArrayList…

Minha pergunta era a seguinte…

Nao teria como eu colocar no construtor da classe aquele trecho de codigo para nao fazer aquele loop?

Valeu[/quote]

Tenho quase certeza que nao.[/quote]

Sem problemas cara…agradeço a sua ajuda e dos outros amigos

Obrigado