Programinha, orientação a objetos (Ajuda)

5 respostas
xivan

Então galera, estou com um problema. Vou postar o código em primeiro lugar!

import javax.swing.*;
public class projetoInt {
	static int MAX=1000;
	static Analista analistas[] = new Analista[MAX];
	static Projetista projetistas[] = new Projetista[MAX];
	static Programador programadores[] = new Programador[MAX];
	static int x = 0;
	static int op=0;
	
	public static void main(String args[]){
		
		while(true){
			op=Integer.parseInt(JOptionPane.showInputDialog(""+
					"Digite a opção desejada \n" +
					"1 - Analistas\n" +
					"2 - Projetistas\n" +
					"3 - Programadores"));
			switch(op){
			case 1:
				menuAna();
			break;
			case 2:	
				menuProj();
			break;
			case 3:
				menuProg();
			break;	
			}		
		}
			
		}
	
	private static void insereAna(){
		for (int i=0;i<MAX;i++){
			if (analistas[i]==null){
				String nomeAux = (JOptionPane.showInputDialog("Coloque o nome do analista"));
				analistas[i] = new Analista(nomeAux);
				break;	
			}
		}
	}	
	private static void insereProj(){
		for (int i=0;i<MAX;i++){
			if (projetistas[i]==null){
			 String nomeAux =(JOptionPane.showInputDialog("Coloque o nome do Projetista"));
			projetistas[i] = new Projetista(nomeAux);
			break;
			}
		}
	}
	private static void insereProg(){
		for (int i=0;i<MAX;i++){
			if (programadores[i] == null){
				String nomeAux=JOptionPane.showInputDialog("Coloque o nome do Programador");
				programadores[i] = new Programador(nomeAux);
				break;
			}
		}
		
		
	}
	private static void listarAna(){
		String aux = "";
		for (int i=0; i<MAX;i++){
			if(analistas[i]!=null){
				aux = aux + "\n"+ analistas[i].getNome();
			}
			
			
		}
		JOptionPane.showMessageDialog(null,aux,"Lista de analistas",JOptionPane.INFORMATION_MESSAGE);
	}
	private static void listarProj(){
		String aux="";
		for (int i=0;i<MAX;i++){
			if (projetistas[i]!=null){
				aux = aux +"\n"+projetistas[i].getNome();
			}
		}
		JOptionPane.showMessageDialog(null,aux, "Lista de Projetistas", JOptionPane.INFORMATION_MESSAGE);
	}
	private static void listarProg(){
		String aux="";
		for (int i=0;i<MAX;i++){
			if (programadores[i]!=null){
				aux=aux+"\n"+programadores[i].getNome();
			}	
		}
		JOptionPane.showMessageDialog(null,aux,"Listar programadores", JOptionPane.INFORMATION_MESSAGE);
	}
	private static void apagarAna(){
		String nome=JOptionPane.showInputDialog("Coloque o analista a ser deletado");
		for(int i=0;i<MAX;i++){
			if(analistas[i].getNome().equalsIgnoreCase(nome)){
				analistas[i]=null;
					JOptionPane.showMessageDialog(null,"Retirado");
					break;
			}
		}
	}
	private static void apagarProj(){
		String nome=JOptionPane.showInputDialog("Escreva o projetista a ser deletado");
		for (int i=0;i<MAX;i++){
			if(projetistas[i].getNome().equalsIgnoreCase(nome)){
				projetistas[i]=null;
				JOptionPane.showMessageDialog(null,"Retirado");
				break;
			}
		}
	}
	private static void apagarProg(){
		String nome=JOptionPane.showInputDialog("Escreva o programador a ser deletado");
		for(int i=0;i<MAX;i++){
			if(programadores[i].getNome().equalsIgnoreCase(nome)){
				programadores[i]=null;
				JOptionPane.showMessageDialog(null,"Retirado");
				break;
			}
		}
	}
	private static void menuAna(){
		while(true){
		int aux=Integer.parseInt(JOptionPane.showInputDialog(""+
				"1 - Inserir Analista \n" +
				"2 - Listar Analistas \n" +
				"3 - Apagar Analista \n"));
			switch(aux){
			case 1:
				insereAna();
				break;
			case 2:
				listarAna();
				break;
			case 3:
				apagarAna();
				break;
			}
		}
	}
	private static void menuProj(){
		while(true){
			int aux=Integer.parseInt(JOptionPane.showInputDialog(""+
					"1 - Inserir Projetista \n"+
					"2 - Listar Projetistas \n"+
					"3 - Apagar Projetista \n"));
			switch(aux){
			case 1:
				insereProj();
			break;
			case 2:
				listarProj();
			break;	
			case 3:
				apagarProj();
			break;	
			}
		}
	}
	private static void menuProg(){
		while(true){
		int aux=Integer.parseInt(JOptionPane.showInputDialog("" +
				"1 - Inserir Programador \n" +
				"2 - Listar Programadores \n" +
				"3 - Apagar Programador \n"));
			switch(aux){
			case 1:
				insereProg();
			break;
			case 2:
				listarProg();
			case 3:
				apagarProg();
			break;	
			}
		}
	}
}

Um exemplo se um analista é apagado, no começo, se eu inserir outro analista… ele vai ser inserido no lugar onde o outro foi removido. Se eu apagar alguém e pedir pra listar, ele lista sem essa pessoa, mas se eu for mandar apagar mais alguém sem adicionar alguém no lugar dessa pessoa, dá erro. Alguém me ajuda a resolver isso… valeu

5 Respostas

zeppo

Já tentou usar uma lista ao invés de um array?
Pode ser que te ajude. Por exemplo:

// ao invés de
static Analista analistas[] = new Analista[MAX];
// use
List<Analista> analistas = new ArrayList<Analista>();

Com a lista você pode usar os métodos add() e remove() ao invés de setar como null, que pode causar problemas no seu programa.

H

NullPointerException…

O problema é que na segunda vez que você exclui um analista seu programa faz “null.getNome()”, onde analistas[i] da iteração anterior é nulo. =)

Duas opções, troca esses arrays pra java.util.List (e java.util.ArrayList).
Ou você vai precisar reorganizar seu array após cada inclusão.

[]'s
Homero

M

Os métodos apagarAna(), apagarProj() e apagarProg() não verificam se a classe referente a respectiva profissão foi instanciada (verifica se é nula).
Por exemplo, se tentarmos apagar um analista sem que tenhamos inserido um novo, o sistema executará o código abaixo:

if (analistas[i].getNome().equalsIgnoreCase(nome)) { analistas[i] = null; JOptionPane.showMessageDialog(null, "Retirado"); break; }
Perceba que o código não verifica se o array analistas possui um elemento instaciado na posição i.
Altere o código realizando a verificação para todas as profissões, conforme abaixo:

if(analistas[i] != null && nalistas[i].getNome().equalsIgnoreCase(nome)) { analistas[i] = null; JOptionPane.showMessageDialog(null, "Retirado"); break; }

Podem existir outros erros no seu código que não estão sendo previstos, como se caso cancelarmos a tela de opções de inserção, listagem e exclusão. Recomendo utilizar uma IDE (NetBeans, Eclipse etc.) para que seja possível a depuração mais simples do código e corrigir os demais problemas.

xivan

Então cara, funcionou muito bem isso ae! valeu!
Tenho mais uma dúvida…
No código:

private static void insereProg(){
		for (int i=0;i<MAX;i++){
			if (programadores[i] == null){
				String nomeAux=JOptionPane.showInputDialog("Coloque o nome do Programador");
				programadores[i] = new Programador(nomeAux);
				break;
			}
		}
	}

Ele insere, no primeiro null que ele vê! O que eu queria fazer é o seguinte, mesmo que o primeiro programador da lista tenha sido removido ele insira atras do ultimo da lista… não no primeiro null que ele ve. valeu

71C4700

Então armazena na posicao correta direto, recupera o tamanho do vetor ou a posição do ultimo que foi inserido e incrementa antes de adicionar
Mas teria uma maneira melhor, não seria mais comprensivel se a parte que se encarrega de armazenar no array fosse colocado em uma classe extra, ou metodo talvez, sugestão.!!

Criado 7 de setembro de 2008
Ultima resposta 7 de set. de 2008
Respostas 5
Participantes 5