Projeto Java - Validação

10 respostas
S

Olá!
Alguém estaria interessado em ajudar um pobre iniciante em Java, fazendo o projeto final da disciplina dele? Posso mandar a especificação completa do mesmo. Tem q ficar pronto em 2 semanas!!!

Senão, me ajudem a saber porque o método validaCodigo não funciona corretamente? São duas Classes "físicas":

import java.util.Scanner;
import java.util.Vector;

public class Hospital {
	public static void main(String[] args) {
		Scanner ler = new Scanner (System.in);
		Vector vetor = new Vector();
		Integer opc;
		do{
			System.out.println("Digite a opção:\n1- Cadastrar\n2- Alterar\n0- Sair");
			opc = ler.nextInt();
			if(opc==1)
				vetor = cadastraArea();
			if(opc==2)
				alteraArea(vetor);
		}while(opc!=0);
	}
	
	public static Vector cadastraArea(){
		Scanner ler = new Scanner(System.in);
		Integer codigo, opcao;
		String nome, descricao;
		Vector vetorArea = new Vector();
		
		do{
			Area area = new Area();
			
			System.out.println("Digite o código da área: ");
			codigo = validaCodigo(vetorArea);
			area.setCodigo(codigo);
			
			System.out.println("Digite o nome da área de código " + codigo + ": ");
			nome = validaNome(vetorArea);
			area.setNome(nome);
			
			System.out.println("Digite uma descrição para " + nome + ": ");
			descricao = validaDescricao(vetorArea);
			area.setDescricao(descricao);
			
			vetorArea.add(area);
			
			System.out.println("Deseja cadastrar mais uma área? 1- Sim  2- Não");
			opcao = ler.nextInt();
		}while(opcao==1);
		
		return vetorArea;
	}
	
	public static void alteraArea(Vector vt){
		Scanner ler = new Scanner (System.in);
		Integer opcao, codArea;
		String novoNome;
		
		System.out.println ("O que deseja alterar? 1- Nome  2- Descrição");
		opcao = ler.nextInt();
		
		switch(opcao){
		  case 1:{
			  System.out.println("Digite o código da área que deseja alterar: ");
			  codArea = ler.nextInt();
			  ler.nextLine();
			  
			  for (int aux=0; aux<vt.size(); aux++){
				  Area areas = (Area) vt.get(aux);
				  
				  if(areas.getCodigo() == codArea){
					  System.out.println ("Area: " + areas.getNome());
					  System.out.println ("Descrição: " + areas.getDescricao());
					  System.out.println ("Digite o novo nome: ");
					  novoNome = ler.nextLine();
					  areas.setNome(novoNome);
					  vt.add(areas);
					  break;
				  }
			  }
		  }
		}
	}
	
	public static Integer validaCodigo(Vector vtArea){
		Scanner ler = new Scanner (System.in);
		
		Integer cod = ler.nextInt();
		
		for (int aux=0; aux<vtArea.size(); aux++){
			Area areas = (Area) vtArea.get(aux);
			
			while(cod == areas.getCodigo()){
				System.out.println("Este código já existe. Escolha outro: ");
				cod = ler.nextInt();
				
			}
		}
		return cod;
	}
	
	public static String validaNome(Vector vtArea){
		Scanner ler = new Scanner (System.in);
		
		String nom = ler.nextLine();
		
		for (int aux=0; aux<vtArea.size(); aux++){
			Area areas = (Area) vtArea.get(aux);
			
			while(nom.equalsIgnoreCase(areas.getNome())){
				System.out.println("Inválido. Digite novamente: ");
				nom = ler.nextLine();
			}
		}
		return nom;
	}
	
	public static String validaDescricao(Vector vtArea){
		Scanner ler = new Scanner (System.in);
		
		String descr = ler.nextLine();
		
		return descr;
	}

}
public class Area {
	private Integer codigo;
	private String nome, descricao;
	
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getNome() {
		return nome;
	}
	public Integer getCodigo() {
		return codigo;
	}
	public String getDescricao() {
		return descricao;
	}	
}

Obrigado!

10 Respostas

adrian.gois
while(cod == areas.getCodigo()){  
.
.
.

O problema está nesse trecho. Comparação de dois Objetos não é feito dessa forma. Se sua variável ‘cod’ e o ‘getCodigo()’ retornasse um primitivo ‘int’ daria certo dessa forma.

Tente:

while(cod.equals(areas.getCodigo())){  
.
.
.
S

Muito obrigado pela rápida resposta adrian.gois!

Resolveu uma parte do problema. A outra parte é que tem aquele menuzinho no início neh?! A validação está funcionando apenas na primeira vez que entro na opção “cadastrar”. Se dentro de Cadastrar eu optar por não cadastrar mais, e ao voltar ao menu eu escolher novamente cadastrar aí a validação já não funciona para os códigos criados no primeiro cadastramento. Isso, claro, sem encerrar o programa. Apenas usando as opções em execução. Isso tb não to entendendo bem pq acontece…

programadormaia

Fala Rapaziada!!!
Amigo… vc esta enviando um argumento Vector vazio para o metodo validaCodigo.
Quando você usa o metodo vtArea.size() para recuperar o tamanho do vetor, ele retorna 0, e não entra no for.
Não sei muito bem o propósito da classe, e não testei, mais creio que esse seja um problema.
Abs

Victor Maia

S

Boa tarde programadormaia! Não creio ser um problema. Se um Vector é enviado vazio, não precisa entrar no for pois não tem um valor anterior para validar. Na segunda vez que ele for enviado, o for vai entrar em ação e vai comparar com o zero, já que agora ele é 1. Eu penso que seja assim, mas vou fazer testes pensando no que você falou. Obrigado!

adrian.gois
public static Vector cadastraArea(){  
        Scanner ler = new Scanner(System.in);  
        Integer codigo, opcao;  
        String nome, descricao;  
        Vector vetorArea = new Vector();  
          
        do{  
            Area area = new Area(); 
              
            System.out.println("Digite o código da área: ");  
            codigo = validaCodigo(vetorArea);  
            area.setCodigo(codigo);  
...

O problema é que você está dando um new no objeto, toda vez que retorna o loop. New no objeto, significa instanciar um objeto, perdendo assim toda referência que vc tinha nele anteriormente.

Tente retirar ele de dentro do loop. Fica assim:

public static Vector cadastraArea(){  
        Scanner ler = new Scanner(System.in);  
        Integer codigo, opcao;  
        String nome, descricao;  
        Vector vetorArea = new Vector();  
        Area area = new Area();
  
        do{  
              
              
            System.out.println("Digite o código da área: ");  
            codigo = validaCodigo(vetorArea);  
            area.setCodigo(codigo);
adrian.gois

Desculpa… Desconsidere o que falei anteriormente e siga o que o colega ai falou… Realmente o problema é no seu vetor.

adrian.gois

Seu problema se resolve da seguinte forma.

Tire o vetorArea de:

public static Vector cadastraArea(){  
        Scanner ler = new Scanner(System.in);  
        Integer codigo, opcao;  
        String nome, descricao;  
      
         Vector vetorArea = new Vector();  
...

Quando vc sai do menu, perde a referencia ao vetor que vc cadastrou os codigos.

Faz uma variavel static fora de tudo.
Fica assim:

import java.util.Scanner;  
import java.util.Vector;  
  
public class Principal {  
	
	private static Vector vetorAreasCadastradas = new Vector();
    public static void main(String[] args) {  
        Scanner ler = new Scanner (System.in);  
        Vector vetor = new Vector();  
         
        Integer opc;  
        do{  
            System.out.println("Digite a opção:\n1- Cadastrar\n2- Alterar\n0- Sair");  
            opc = ler.nextInt();  
            if(opc==1)  
                vetor = cadastraArea();  
            if(opc==2)  
                alteraArea(vetor);  
        }while(opc!=0);  
    }  
      
    public static Vector cadastraArea(){  
        Scanner ler = new Scanner(System.in);  
        Integer codigo, opcao;  
        String nome, descricao;  
      
         Vector vetorArea = new Vector();  
          
        do{  
            //Area area = new Area();  
              
        	Area area = new Area();
            System.out.println("Digite o código da área: ");  
            codigo = validaCodigo(vetorAreasCadastradas);  
            area.setCodigo(codigo);  
              
            System.out.println("Digite o nome da área de código " + codigo + ": ");  
            nome = validaNome(vetorAreasCadastradas);  
            area.setNome(nome);  
              
            System.out.println("Digite uma descrição para " + nome + ": ");  
            descricao = validaDescricao(vetorAreasCadastradas);  
            area.setDescricao(descricao);  
              
            vetorAreasCadastradas.add(area);  
              
            System.out.println("Deseja cadastrar mais uma área? 1- Sim  2- Não");  
            opcao = ler.nextInt();  
        }while(opcao==1);  
          
        return vetorAreasCadastradas;  
    }  
      
    public static void alteraArea(Vector vt){  
        Scanner ler = new Scanner (System.in);  
        Integer opcao, codArea;  
        String novoNome;  
          
        System.out.println ("O que deseja alterar? 1- Nome  2- Descrição");  
        opcao = ler.nextInt();  
          
        switch(opcao){  
          case 1:{  
              System.out.println("Digite o código da área que deseja alterar: ");  
              codArea = ler.nextInt();  
              ler.nextLine();  
                
              for (int aux=0; aux<vt.size(); aux++){  
                  Area areas = (Area) vt.get(aux);  
                    
                  if(areas.getCodigo() == codArea){  
                      System.out.println ("Area: " + areas.getNome());  
                      System.out.println ("Descrição: " + areas.getDescricao());  
                      System.out.println ("Digite o novo nome: ");  
                      novoNome = ler.nextLine();  
                      areas.setNome(novoNome);  
                      vt.add(areas);  
                      break;  
                  }  
              }  
          }  
        }  
    }  
      
    public static Integer validaCodigo(Vector vtArea){  
        Scanner ler = new Scanner (System.in);  
          
        Integer cod = ler.nextInt();  
          
        for (int aux=0; aux<vtArea.size(); aux++){  
            Area areas = (Area) vtArea.get(aux);  
              
            while(cod == areas.getCodigo()){  
                System.out.println("Este código já existe. Escolha outro: ");  
                cod = ler.nextInt();  
                  
            }  
        }  
        return cod;  
    }  
      
    public static String validaNome(Vector vtArea){  
        Scanner ler = new Scanner (System.in);  
          
        String nom = ler.nextLine();  
          
        for (int aux=0; aux<vtArea.size(); aux++){  
            Area areas = (Area) vtArea.get(aux);  
              
            while(nom.equalsIgnoreCase(areas.getNome())){  
                System.out.println("Inválido. Digite novamente: ");  
                nom = ler.nextLine();  
            }  
        }  
        return nom;  
    }  
      
    public static String validaDescricao(Vector vtArea){  
        Scanner ler = new Scanner (System.in);  
          
        String descr = ler.nextLine();  
          
        return descr;  
    }  
  


 


}

O segredo tá em private static Vector vetorAreasCadastradas = new Vector();

agora é uma variável estatica que vc pode referenciar a qualquer momento.

Thiago_Luis

Fala cara, blza?

Meu, eu fiz umas alterações cara, veja se vc entende.
Por enquanto, só fiz funfar a parte da da validação.
O que eu fiz foi passar como parâmetro para o cadastraArea, o vetor correspondente.
Daí no cadastraArea, vc não precisa mais criar outro vetor, era esse o problema.

Veja se vc entende:
import java.util.Scanner;   
import java.util.Vector;   
  
public class Hospital {   
    public static void main(String[] args) {   
        Scanner ler = new Scanner (System.in);   
        Vector<Area> vetor = new Vector<Area>();   
        Integer opc;   
        do{   
            System.out.println("Digite a opção:\n1- Cadastrar\n2- Alterar\n0- Sair");   
            opc = ler.nextInt();   
            if(opc==1)   
                vetor = cadastraArea(vetor);   
            if(opc==2)   
                alteraArea(vetor);   
        }while(opc!=0);   
    }   
       
    public static Vector<Area> cadastraArea(Vector<Area> vetorArea){   
        Scanner ler = new Scanner(System.in);   
        Integer codigo, opcao;   
        String nome, descricao;   
           
        do{   
            Area area = new Area();   
               
            System.out.println("Digite o código da área: ");   
            codigo = validaCodigo(vetorArea);   
            area.setCodigo(codigo);   
               
            System.out.println("Digite o nome da área de código " + codigo + ": ");   
            nome = validaNome(vetorArea);   
            area.setNome(nome);   
               
            System.out.println("Digite uma descrição para " + nome + ": ");   
            descricao = validaDescricao(vetorArea);   
            area.setDescricao(descricao);   
               
            vetorArea.add(area);   
               
            System.out.println("Deseja cadastrar mais uma área? 1- Sim  2- Não");   
            opcao = ler.nextInt();   
        }while(opcao==1);   
           
        return vetorArea;   
    }   
       
    public static void alteraArea(Vector<Area> vt){   
        Scanner ler = new Scanner (System.in);   
        Integer opcao, codArea;   
        String novoNome;   
           
        System.out.println ("O que deseja alterar? 1- Nome  2- Descrição");   
        opcao = ler.nextInt();   
           
        switch(opcao){   
          case 1:{   
              System.out.println("Digite o código da área que deseja alterar: ");   
              codArea = ler.nextInt();   
              ler.nextLine();   
                 
              for (int aux=0; aux<vt.size(); aux++){   
                  Area areas = (Area) vt.get(aux);   
                     
                  if(areas.getCodigo() == codArea){   
                      System.out.println ("Area: " + areas.getNome());   
                      System.out.println ("Descrição: " + areas.getDescricao());   
                      System.out.println ("Digite o novo nome: ");   
                      novoNome = ler.nextLine();   
                      areas.setNome(novoNome);   
                      vt.add(areas);   
                      break;   
                  }   
              }   
          }   
        }   
    }   
       
    public static Integer validaCodigo(Vector<Area> vtArea){   
        Scanner ler = new Scanner (System.in);   
           
        Integer cod = ler.nextInt();   
           
        for (int aux=0; aux<vtArea.size(); aux++){   
            Area areas = (Area) vtArea.get(aux);   
               
            while(cod == areas.getCodigo()){   
                System.out.println("Este código já existe. Escolha outro: ");   
                cod = ler.nextInt();   
                   
            }   
        }   
        return cod;   
    }   
       
    public static String validaNome(Vector<Area> vtArea){   
        Scanner ler = new Scanner (System.in);   
           
        String nom = ler.nextLine();   
           
        for (int aux=0; aux<vtArea.size(); aux++){   
            Area areas = (Area) vtArea.get(aux);   
               
            while(nom.equalsIgnoreCase(areas.getNome())){   
                System.out.println("Inválido. Digite novamente: ");   
                nom = ler.nextLine();   
            }   
        }   
        return nom;   
    }   
       
    public static String validaDescricao(Vector<Area> vtArea){   
        Scanner ler = new Scanner (System.in);   
           
        String descr = ler.nextLine();   
           
        return descr;   
    }   
  
}

Ah, com Vector e Colleciotns, use sempre Generics. É um conceito muito interessante :D

Abraço

adrian.gois

Tambem pode funcionar a solução do companheiro acima, porem vc terá que alterar o metodo de validaçao, pra ele receber como parametro o vetor, digamos GLOBAL…

S

Senhores, muito obrigado pela presteza!!!

As duas soluções apresentadas solucionam muito bem meu problema!!

E, além disso, me ajudaram a entender e perceber algumas coisinhas que eu não estava vendo!

Obrigado!

Criado 28 de maio de 2009
Ultima resposta 28 de mai. de 2009
Respostas 10
Participantes 4