Problema na substituicao de posicoes no vetor

Estou tendo problemas com um metodo do meu sistema…

public class TProduto {
	public int codigo;
	public String nome;
	public double preco, quantidadeEstoque, quantidadeMinima;
	
	public void aumentaPreco(double p2) {
		preco=preco+(preco*p2);
	}
	public void diminuiPreco () {
		
	}
	public void incrementaQuantidade() {
		
	}
	public void incrementaQuantidade(double q) {
		quantidadeEstoque=quantidadeEstoque+q;
	}
	public void decrementaQuantidade() {
		
	}
	public void decrementaQuantidade(double q) {
		quantidadeEstoque=quantidadeEstoque-q;
	}
}

E aqui está o sistema estou com problemas na substituicao de uma determinada posicao do vetor, pelo produto q esta na ultima posicao do vetor ou seja quero fazer assim, pega o produto q esta na posicao B e subtituir pelo produto q esta na posicao D, esta q seria a ultima posicao do vetor.

O Problema seria nos procedimento removerProduto, aumentaprecoProduto, aumentaprecotodos.

import javax.swing.JOptionPane;

public class Loja {
	static TProduto[] produtos=new TProduto[200];
	static int q=0;
	public static void main(String[] args) {
		int x=0;
		do {
			x=menu();
			switch(x) {
			case 1: { //inserirProduto
				produtos[q]=new TProduto();
				inserirProduto(produtos);
				q++;
				break;
			}
			case 2: { //removerProduto
				String p1=JOptionPane.showInputDialog(null, "digite o nome do produto").toUpperCase();
				removerProduto(p1);
				q--;
				break;
			}
			case 3: { //consultarProduto
				String p1=JOptionPane.showInputDialog(null, "nome do produto").toUpperCase();
				consultarProduto(p1);
				break;
			}
			case 4: { //aumentaPrecoProduto
				String p1=JOptionPane.showInputDialog(null, "nome do produto").toUpperCase();
				double p2=Double.parseDouble(JOptionPane.showInputDialog(null, "porcentagem de aumento"));
				aumentaPrecoProduto(p1, p2);
				break;
			}
			case 5: { //aumentaPrecoTodos
				double p2=Double.parseDouble(JOptionPane.showInputDialog(null, "porcentagem de aumento"));
				aumentaPrecoTodos(p2);
				break;
			}
			case 6: { //venderProduto
				String p1=JOptionPane.showInputDialog(null, "nome do produto").toUpperCase();
				venderProduto(p1);
				break;
			}
			case 7: { //comprarProduto
				String p1=JOptionPane.showInputDialog(null, "nome do produto").toUpperCase();
				comprarProduto(p1);
				break;
			}
			case 8: { //VerificaEstoque
				String p1=JOptionPane.showInputDialog(null, "nome do produto").toUpperCase();
				for (int i=0;i<q;i++) {
					if (p1.equals(produtos[i].nome)) {
						double q1=Double.parseDouble(JOptionPane.showInputDialog(null, "quatidade desejada"));
						int c1=produtos[i].codigo;
						if (verificaEstoque(c1,q1)) {
							JOptionPane.showMessageDialog(null, "quantidade suficiente");
						} else {
							JOptionPane.showMessageDialog(null, "quantidade insuficiente");
						}
					} else {
						JOptionPane.showMessageDialog(null, "produto inexistente");
					}
				}
				break;
			}
			case 9: { //listarAbaixoMinimo
				listarAbaixoMin();
				break;
			}
			case 10: { //listarProdutos
				listarProdutos();
				break;
			}
			}
		} while(x!=11);
	}
	static int menu() {
		String m="1 - inserir produto";
		m+="\n2 - excluir produto";
		m+="\n3 - consultar";
		m+="\n4 - aumentar preço de um produto";
		m+="\n5 - aumentar preço de todos";
		m+="\n6 - vender";
		m+="\n7 - comprar";
		m+="\n8 - verificar estoque";
		m+="\n9 - listar abaixo do minimo";
		m+="\n10 - listar todos";
		m+="\n11 - sair";
		int op=0;
		do {
			op=Integer.parseInt(JOptionPane.showInputDialog(null, m));
			if (op<1 || op>11) {
				JOptionPane.showMessageDialog(null, "Opção Invalida");
			}
		} while(op<1 || op>11);
		return op;
	}
	static boolean verifica(String n) {
		for (int i=0;i<q;i++) {
			if (n.equals(produtos[i].nome)) {
				return true;
			}
		}
		return false;
	}
	static boolean verificaEstoque(int c1, double q1) {
		for (int i=0;i<q;i++) {
			if (c1==produtos[i].codigo) {
				if (q1<=produtos[i].quantidadeEstoque) {
					return true;
				} 
			}
		}
		return false;
	}
	static void decrementaQtd(int c1, double q1) {
		for (int i=0;i<q;i++) {
			if (c1==produtos[i].codigo) {
				produtos[i].decrementaQuantidade(q1);
			}
		}
	}
	static void incrementaQtd(int c1, double q1) {
		for (int i=0;i<q;i++) {
			if (c1==produtos[i].codigo) {
				produtos[i].incrementaQuantidade(q1);
			}
		}
	}
	static void inserirProduto(TProduto[] p) {
		int c=0;
		while (c==0) {
			String p1=JOptionPane.showInputDialog(null, "nome do produto").toUpperCase();
			if (!verifica(p1)) {
				p[q].nome=p1;
				p[q].codigo=Integer.parseInt(JOptionPane.showInputDialog(null, "codigo do produto"));
				p[q].preco=Double.parseDouble(JOptionPane.showInputDialog(null, "preço do produto"));
				p[q].quantidadeEstoque=Double.parseDouble(JOptionPane.showInputDialog(null, "quantidade em estoque"));
				p[q].quantidadeMinima=Double.parseDouble(JOptionPane.showInputDialog(null, "quantidade minima"));
				c=1;
			} else {
				JOptionPane.showMessageDialog(null, "produto existente");
			}
		}
	}
	static void consultarProduto(String p1) {
		String m1="dados do produto:";
		if (verifica(p1)) {
			for (int i=0;i<q;i++) {
				if (p1.equals(produtos[i].nome)) {
					m1+="produto: "+produtos[i].nome;
					m1+="\ncodigo: "+produtos[i].codigo;
					m1+="\npreço: "+produtos[i].preco;
					m1+="\nqtd estoque: "+produtos[i].quantidadeEstoque;
					m1+="\nqtd minima: "+produtos[i].quantidadeMinima;
				} 
			}
			JOptionPane.showMessageDialog(null, m1);
		} else {
			JOptionPane.showMessageDialog(null, "produto inexistente");
		}
	}
	static void removerProduto(String p1) { //O PROBLEMA SE ENCONTRA NESTE PROCEDIMENTO.
		if (verifica(p1)) {
			for (int i=0;i<q;i++) {
				if (p1.equals(produtos[i].nome)) {
					produtos[i].codigo=produtos[q].codigo;
					produtos[i].nome=produtos[q].nome;
					produtos[i].preco=produtos[q].preco;
					produtos[i].quantidadeEstoque=produtos[q].quantidadeEstoque;
					produtos[i].quantidadeMinima=produtos[q].quantidadeMinima;
				}
			}
		} else {
			JOptionPane.showMessageDialog(null, "produto inexistente");
		}
	}
	static void aumentaPrecoProduto(String p1, double p2) { 
		if (verifica(p1)) {
			for (int i=0;i<=q;i++) {
				if (p1.equals(produtos[i].nome)) {
					produtos[i].aumentaPreco(p2);
				}
			}
		} else {
			JOptionPane.showMessageDialog(null, "produto inexistente");
		}
	}
	static void aumentaPrecoTodos(double p2) { 
		for (int i=0;i<=q;i++) {
			produtos[i].aumentaPreco(p2);
		}
	}
	static void venderProduto(String p1) {
		if (verifica(p1)) {
			for (int i=0;i<q;i++) {
				if (p1.equals(produtos[i].nome)) {
					int c1=produtos[i].codigo;
					double q1=Double.parseDouble(JOptionPane.showInputDialog(null, "quatidade desejada"));
					if (verificaEstoque(c1,q1)) {
						decrementaQtd(c1,q1);
						JOptionPane.showMessageDialog(null, "vendido: "+produtos[i].nome+"\nquantidade: "+q1);
					} else {
						JOptionPane.showMessageDialog(null, "quantidade em estoque insuficiente");
					}
				}
			}
		} else {
			JOptionPane.showMessageDialog(null, "produto inexistente");
		}
	}
	static void comprarProduto(String p1) {
		if (verifica(p1)) {
			for (int i=0;i<q;i++) {
				if (p1.equals(produtos[i].nome)) {
					int c1=produtos[i].codigo;
					double q1=Double.parseDouble(JOptionPane.showInputDialog(null, "quatidade desejada"));
					incrementaQtd(c1,q1);
				}
			}
		}
	}
	static void listarAbaixoMin() {
		String m1="produtos abaixo do estoque minimo:";
		for (int i=0;i<q;i++) {
			if (produtos[i].quantidadeEstoque<produtos[i].quantidadeMinima) {
				m1+="\nproduto: "+produtos[i].nome+" - estoque: "+produtos[i].quantidadeEstoque+" - minimo: "+produtos[i].quantidadeMinima;
			}
		}
		JOptionPane.showMessageDialog(null, m1);
	}
	static void listarProdutos() {
		String m1="lista de produtos:";
		for (int i=0;i<q;i++) {
				m1+="\nproduto: "+produtos[i].nome+" - codigo: "+produtos[i].codigo+" - preço: "+produtos[i].preco+" - estoque: "+produtos[i].quantidadeEstoque+" - minimo: "+produtos[i].quantidadeMinima;
		}
		JOptionPane.showMessageDialog(null, m1);
	}
}

Muito obrigado a todos pela atencao e por me ajudarem…

Exception in thread "main" java.lang.NullPointerException
	at TrabalhoFinal.Loja.removerProduto(Loja.java:168)
	at TrabalhoFinal.Loja.main(Loja.java:20)

Olá poste a stacktrace para eu dar uma olhada!

Att

postado…

Desculpa não tinha visto a stack!

É o seguinte quando você inseri um produto neste case, você chama o método inserirProduto, e preenche a posição “q” do vetor que vale 0, logo depois incrementa q, que passa a valer 1, certo??

case 1: { //inserirProduto
				produtos[q]=new TProduto();
				inserirProduto(produtos);
				q++;
				break;
			}

Ai na hora de remover o produto você faz o seguinte teste:


static void removerProduto(String p1) { //O PROBLEMA SE ENCONTRA NESTE PROCEDIMENTO.
		if (verifica(p1)) {
			for (int i=0;i<q;i++) {
				if (p1.equals(produtos[i].nome)) {	
					produtos[i].codigo=produtos[q].codigo; //o ERRO ESTÁ AQUI
					produtos[i].nome=produtos[q].nome;
					produtos[i].preco=produtos[q].preco;
					produtos[i].quantidadeEstoque=produtos[q].quantidadeEstoque;
					produtos[i].quantidadeMinima=produtos[q].quantidadeMinima;
				}
			}
		} else {
			JOptionPane.showMessageDialog(null, "produto inexistente");
		}
	}

Nesta hora você manda o produto[i].codigo=produto[q].codigo , só que q =1, e a posição 1 do vetor ainda não foi preenchida, só a 0 que foi, ela está null, ai quando o java vê null.codigo, ela lançã a exception java.lang.NullPointerException, ou seja a referência está nula!

Deu pra entender??

Qualquer dúvida poste ai!

Att

consegui fazer aqui…

Muito Obrigado cara…
abracos…