FJ11: Exercícios: 5.5 Arrays Parte 4

24 respostas
G

Boa noite pessoa, estou com uma dúvida no Exercício 5.5 parte 4 da Apostila FJ-11da Caelum.
Segue a dúvida ( (opcional) Em vez de mostrar apenas o salário de cada funcionário, você pode chamar o método mostra()
de cada Funcionário da sua array.)
Tentei chamar o método mostra() da classe Funcionario e não deu certo, tentei de vária formas.
vou colocar os códigos e se possível, mostre os erros ok.
o código que postarei roda beleza, mais não consigo introduzir o método mostra() da classe funcionário onde o exercício está pedindo.

class Funcionario{

    String nome;
    String departamento;
    double salario;
    String rg;
    boolean estaNaEmpresa;
    Data dataDeEntrada;

    void bonifica(double aumento){
       double novoSalario = this.salario + aumento;
       this.salario = novoSalario;
    }
    
    void demite(){
        if(estaNaEmpresa)
            System.out.println("Está na empresa!");

        else {

            System.out.println("Não está mais na empresa!");
        }
      }
    void mostra(){
        System.out.println("Nome do Funcionário: " + this.nome);
        System.out.println("Departamento: " + this.departamento);
        System.out.println("RG: " + this.rg);
        System.out.println("Salário: " + this.salario);
        System.out.println("Admissão: " + this.dataDeEntrada.dia + "/" +
                this.dataDeEntrada.mes + "/" + this.dataDeEntrada.ano);
    }
 }

   class Data{
       
       int dia;
       int mes;
       int ano;
   }

   class Empresa{

       Funcionario [] empregados;
       String cnpj;
       String nomeEmpresa;
       static int contador;

       void adiciona (Funcionario f){
           if(contador < 10)
               this.empregados[contador ++] = f;

       }

       void mostraEmpregados(){
           for(int i = 0; i < this.empregados.length; i++){
              System.out.println("Funcionário na posição: " + i);
              System.out.println("Salário: " + this.empregados[i].salario);
              
           }

          
          
       }

}

   

   class TestaEmpresa{

       public static void main( String [] args){

           Empresa empresa = new Empresa();

           empresa.empregados = new Funcionario[10];

           Funcionario f1 = new Funcionario();
           f1.salario = 1000;
           empresa.adiciona(f1);
           

           Funcionario f2 = new Funcionario();
           f2.salario = 1700;
           empresa.adiciona(f2);

           Funcionario f3 = new Funcionario();
           f3.salario = 1100;
           empresa.adiciona(f3);

           Funcionario f4 = new Funcionario();
           f4.salario = 900;
           empresa.adiciona(f4);

           Funcionario f5 = new Funcionario();
           f5.salario = 1300;
           empresa.adiciona(f5);

           Funcionario f6 = new Funcionario();
           f6.salario = 1700;
           empresa.adiciona(f6);

           Funcionario f7 = new Funcionario();
           f7.salario = 850;
           empresa.adiciona(f7);

           Funcionario f8 = new Funcionario();
           f8.salario = 1700;
           empresa.adiciona(f8);

           Funcionario f9 = new Funcionario();
           f9.salario = 900;
           empresa.adiciona(f9);

           Funcionario f10 = new Funcionario();
           f10.salario = 1350;
           empresa.adiciona(f10);

           empresa.mostraEmpregados();
     
        }

   }

24 Respostas

gRoOve

Quando você executa o programa como está, qual a saída?
No método mostraEmpregados() você está exibindo o atributo salário em vez de chamar o método mostra().

G

gRoOve:
gilvani lima:

void mostraEmpregados(){
           for(int i = 0; i < this.empregados.length; i++){
              System.out.println("Funcionário na posição: " + i);
              System.out.println("Salário: " + this.empregados[i].salario);


Quando você executa o programa como está, qual a saída?
No método mostraEmpregados() você está exibindo o atributo salário em vez de chamar o método mostra().

Primeiramente, obrigado por se dispor a ajudar!
Então, quando eu executo o código, a saida é essa.
run:
Funcionário na posição: 0
Salário: 1000.0
Funcionário na posição: 1
Salário: 1700.0
Funcionário na posição: 2
Salário: 1100.0
Funcionário na posição: 3
Salário: 900.0
Funcionário na posição: 4
Salário: 1300.0
Funcionário na posição: 5
Salário: 1700.0
Funcionário na posição: 6
Salário: 850.0
Funcionário na posição: 7
Salário: 1700.0
Funcionário na posição: 8
Salário: 900.0
Funcionário na posição: 9
Salário: 1350.0
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

gRoOve

Então o erro é este mesmo que eu apontei, no método main você chama empresa.mostra();
É isso ai, espero ter ajudado.

G

gRoOve:
Então o erro é este mesmo que eu apontei, no método main você chama empresa.mostra();
É isso ai, espero ter ajudado.

Não entendi muito bem! Mas, mesmo assim eu tentei aqui e vou mostrar os resultados.

void mostraEmpregados(){
           for(int i = 0; i < this.empregados.length; i++){
              System.out.println("Funcionário na posição: " + i);
              System.out.println("Salário: " + this.empregados[i].salario);
              this.empregados[i].mostra();
Não da certo! Os resultados são esses.

run:

Funcionário na posição: 0

Exception in thread main java.lang.NullPointerException

Nome do Funcionário: null

Departamento: null

RG: null

Salário: 1000.0

at Funcionario.mostra(Funiconario.java:30)

at Empresa.mostraEmpregados(Funiconario.java:59)

at TestaEmpresa.main(Funiconario.java:113)

Java Result: 1

Também não posso chamar o método mostra() que pertence a classe Funcionario e tentar exibir ele em System.out.print pq ele void. Fiz as mudanças que eu entendi na sua explicação e não deu certo, poderia mostrar a explicação em códigos? Obrigado

G

Mais ninguém!

gRoOve

Perceba que os atributos estão retornando null pois você em nenhum momento entrou com estes dados.
Está ocorrendo o erro NullPointerException pois você está usando a Classe Data e em nenhum momento instânciou a mesma, apenas declarou o atributo dataDeEntrada.

G
gRoOve:
Perceba que os atributos estão retornando null pois você em nenhum momento entrou com estes dados. Está ocorrendo o erro NullPointerException pois você está usando a Classe Data e em nenhum momento instânciou a mesma, apenas declarou o atributo dataDeEntrada.
Sobre os retornos null, eu entrei com os dados para resolvê-los, já tinha deito isto. Agora, sobre NullPointerException esse erro continuou aparecendo. Vou instânciar a Classe Data e ver os resultados. Só um detalhe, vc notou que estou chamando o método void mostra() de outra Classe? A Classe que este método está é na class Funcionario e não na class Empresa. Então, estou neste exato momento refazendo o método void mostraEmpresa dessa forma.
void mostraEmpresa() {
            for (int i = 0; i < this.empregados.length; i++){
                if(this.empregados[i] == null)
                continue;

                System.out.println("Funcionário na posição: " + i );
                System.out.println("Nome: " + this.empregados[i].nome);
                System.out.println("Departamento: " +this.empregados[i].departamento);
                System.out.println("RG: " + this.empregados[i].rg);
                System.out.println("Salário: " + this.empregados[i].salario);
Assim funciona! Mais eu queria algo assim.
void mostraEmpresa() {       
        for (int i = 0; i < this.empregados.length; i++) {       
             if (this.empregados[i] == null) { //1       
                   continue;       
               }       
                
           this.empregados[i].mostra());       
          
       }       
     }
Então vou colocar esse 2° çodigo ai, e instanciar a class Data e ver os resultados. Depois posto aqui novamente ok..muito obrigado pela ajuda.
G

gRoOve:
Perceba que os atributos estão retornando null pois você em nenhum momento entrou com estes dados.
Está ocorrendo o erro NullPointerException pois você está usando a Classe Data e em nenhum momento instânciou a mesma, apenas declarou o atributo dataDeEntrada.

Deu certo aqui, instanciei a class Data e funfo beleza. muito obrigado, sua ajuda foi de grande importância!!! Abraços

gRoOve

No que puder ajudar, estamos ai :slight_smile:

G
Boa tarde, pintou um problema estranho aqui no meu programa e tive que reabrir o tópico. Estava executando o programa aqui e notei um problemas com as datas dos funcionários, o problema é que tenho 3 funcionário com datas de entrada diferentes, mais quando eu executo o programa, aprece a mesma data para os 3 funcionários. Ele pega a data do ultimo funcionário e usa para os 2 primeiros. Vou mostrar!
class TestaEmpresa{

       public static void main( String [] args){

           Empresa empresa = new Empresa();

           empresa.empregados = new Funcionario[3];

           Data data = new Data();
                    
           empresa.nomeEmpresa = "Saga Equipe de Consultoria e Assessoria";
           empresa.cnpj = "09.733.722/0001-32";          

           Funcionario n1 = new Funcionario();
           n1.dataDeEntrada = data;
           n1.dataDeEntrada.dia = 15; // Data do primeiro
           n1.dataDeEntrada.mes = 06;
           n1.dataDeEntrada.ano = 2008;
           empresa.adiciona(n1);
           n1.nome = "Marcos";
           n1.rg = "SP-3.635.369";
           n1.departamento = "Administração";
           n1.salario = 1300;
           
           Funcionario n2 = new Funcionario();
           n2.dataDeEntrada = data;
           n2.dataDeEntrada.dia = 23; //Data do segundo
           n2.dataDeEntrada.mes = 05;
           n2.dataDeEntrada.ano = 2009;
           empresa.adiciona(n2);
           n2.nome = "Juliano";
           n2.rg = "SP-8.258.568";
           n2.departamento = "Desenvolvimento";
           n2.salario = 2400;
           
           Funcionario n3 = new Funcionario();
           n3.dataDeEntrada = data;
           n3.dataDeEntrada.dia = 23; //Data do terceiro, essa que será exibida para todos. Por que?
           n3.dataDeEntrada.mes = 11;
           n3.dataDeEntrada.ano = 2008;
           empresa.adiciona(n3);
           n3.nome = "Claudia";
           n3.rg = "SP-1.583.587";
           n3.departamento = "Recepção";
           n3.salario = 980;
                   
           empresa.mostraEmpresa();
        }

   }
Viu ai, as datas estão diferentes. A saída é essa. run: Nome da Empresa: Saga Equipe de Consultoria e Assessoria CNPJ: 09.733.722/0001-32 Funcionário na posição: 0 Nome do Funcionário: Marcos Departamento: Administração RG: SP-3.635.369 Salário: 1300.0 Admissão: 23/11/2008

Funcionário na posição: 1
Nome do Funcionário: Juliano
Departamento: Desenvolvimento
RG: SP-8.258.568
Salário: 2400.0
Admissão: 23/11/2008

Funcionário na posição: 2
Nome do Funcionário: Claudia
Departamento: Recepção
RG: SP-1.583.587
Salário: 980.0
Admissão: 23/11/2008

CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

gRoOve

Você está compartilhando um objeto data com 3 objetos Funcionário. Deve instanciar o objeto data dentro da classe Funcionário, assim cada funcionário terá sua “data”.

G
Então, fiquei tentando aqui sozinho e fiz o seguinte. Eu instanciei um objeto Data para cada objeto Funcionario na classe TestaFuncionario.
Funcionario n1 = new Funcionario();
           Data entrada1 = new Data(); //objeto Data
           n1.dataDeEntrada = entrada1;
           entrada1.dia = 15;
           entrada1.mes = 06;
           entrada1.ano = 2008;

Funcionario n2 = new Funcionario();
           Data entrada2 = new Data(); //objeto Data
           n2.dataDeEntrada = entrada2;
           entrada2.dia = 23;
           entrada2.mes = 05;
           entrada2.ano = 2009;

Funcionario n3 = new Funcionario();
           Data entrada3 = new Data(); //objeto Data
           n3.dataDeEntrada = entrada3;
           entrada3.dia = 23;
           entrada3.mes = 11;
           entrada3.ano = 2008;
Deu certo, se eu entendi oq vc disse, se eu instanciar um objeto Data na classe Funcionario, daria certo também? pq se der certo, fica até melhor, dessa forma eu não precisaria instanciar um um objeto Data para cada objeto Funcionario. Vou fazer aqui e ver como fica, depois posto os resultados. Muito Obrigado, desculpa se estou incomodando vc muito ok, valeu
gRoOve

O correto é você instanciar Data dentro da classe Funcionário, pois sempre o objeto data ficará atrelado ao funcionário uma vez que um funcionário sempre terá uma “data”.

G
É o seguinte, fiz aqui igual vc sugeriu mais não deu certo não!!! Que cancera heim rs.

Deixei daquela forma mesmo (um objeto Data para cada objeto Funcionario) tah funcionando bem! Mais  um problema! Quando eu mando testar o Projeto na saída aparece o erro ( duplicate class: Data

class Data{

1 error )

Que erro é esse? O Estranho é que quando eu mando executar ele funciona de boa! Uso o NetBeans 6.9, OS Linux Ubuntu 10.10.
gRoOve

Posta ai como você fez pra instanciar o objeto data dentro da classe funcionario.
Como assim testar? Nunca usei esta opção no Netbeans.

G
gRoOve:
Posta ai como você fez pra instanciar o objeto data dentro da classe funcionario. Como assim testar? Nunca usei esta opção no Netbeans.
Para testar o projeto, vou em Executar tem a opção lá Executar Project (F6) e Testar Project (Alt+F6). Minha classe Funcionario está assim atualmente.
class Funcionario{

    String nome;
    String departamento;
    double salario;
    String rg;
    boolean estaNaEmpresa;
    Data dataDeEntrada;
        
    void bonifica(double aumento){
       double novoSalario = this.salario + aumento;
       this.salario = novoSalario;
    }
    
    void demite(){
        if(estaNaEmpresa)
            System.out.println("Está na empresa!");

        else {

            System.out.println("Não está mais na empresa!");
        }
      }
    void mostra(){
        System.out.println("Nome do Funcionário: " + this.nome);
        System.out.println("Departamento: " + this.departamento);
        System.out.println("RG: " + this.rg);
        System.out.println("Salário: " + this.salario);
        System.out.println("Admissão: " + this.dataDeEntrada.dia + "/" +
                this.dataDeEntrada.mes + "/" + this.dataDeEntrada.ano);
    }
 }
Eu estanciei assim,
class Funcionario{

    String nome;
    String departamento;
    double salario;
    String rg;
    boolean estaNaEmpresa;
    Data dataDeEntrada;
    Data data = new Data();
Tah errado né?
gRoOve

Eu nunca usei essa opção “Testar Projeto”, qual a função dela?
Então, você está declarando duas variáveis do tipo Data, mas está instanciando só uma, tem que decidir qual vai usar. Faça assim:

Data dataDeEntrada = new Data();

Teu código vai funcionar da mesma forma, só que o objeto Data vai ficar encapsulado. Só uma dica, encapsule os atributos da classe Funcionário e use get/set para manipulá-los.

G

gRoOve:
Eu nunca usei essa opção “Testar Projeto”, qual a função dela?
Então, você está declarando duas variáveis do tipo Data, mas está instanciando só uma, tem que decidir qual vai usar. Faça assim:

Data dataDeEntrada = new Data();

Teu código vai funcionar da mesma forma, só que o objeto Data vai ficar encapsulado. Só uma dica, encapsule os atributos da classe Funcionário e use get/set para manipulá-los.


Deu certo aqui! Antes de vc responder eu já estava fazendo dessa forma e quando vi sua resposta tive a certeza que estava indo para o caminho certo. Muito obrigado pela sua ajuda.
A função da opção “Testar Projeto” imaginei que vc ia saber e me dizer, mais na boa, eu acreditava que era para compilar o arquivo e vê se tah tudo certo.

gRoOve

Que bom que conseguiu :slight_smile:
Pois é, essa função realmente não sei…quem sabe o pessoal ai saiba :smiley:

G
Sem sombras de dúvidas que o programa ficou bem melhor e mais claro com suas dicas, mais o tal erro ( duplicate class: Data class Data{ error ) persiste quando eu mando "Testar o Projeto" e é só com este programa que isto acontece! O curioso é que quando eu mudo o nome da classe Data para outro nome qualquer o erro some. Esta assim!
class Data{
       
       int dia;
       int mes;
       int ano;
Quando eu mudo o nome da Classe
class Entrada{ // <--- Será que esse é o problema?

      int dia;
      int mes;
      int ano;
Estranho, não?
gledsonvc

no meu caso fiz assim, espero que ajudem a todos

class Data {
	int dia;
	int mes;
	int ano;
}

class Funcionario {
//todos os outros atributos tbm tem que ter
	Data dataDeEntrada = new Data();
	double salario = 0;
//todos os outros métodos tbm tem que ter
	void mostra() {
		System.out.println("Salario: " + this.salario);
		System.out.println("Dia: " + this.dataDeEntrada.dia);
		System.out.println("Mês: " + this.dataDeEntrada.mes);
		System.out.println("Ano: " + this.dataDeEntrada.ano);
		System.out.println();
	}
}

class Empresa {
//todos os outros atributos tbm tem que ter
	Funcionario[] empregados;
	int posicao = 0;
//todos os outros métodos tbm tem que ter
	void adiciona(Funcionario f) {
		this.empregados[posicao] = f;
		this.posicao++;
	}
	void mostraEmpregados() {
		int i;
		for (i = 0; i < this.empregados.length; i++) {
			if (this.empregados[i]==null){
				continue;
			}
			System.out.println("Funcionário na posição: " + i);
			this.empregados[i].mostra();
		}
	}		

}
//programa Principal
public class TestaEmpresa {
	public static void main(String[] args) {
		Empresa empresa = new Empresa();
		empresa.empregados = new Funcionario[10];
//coloquei esse for só para add 5 funcionário qualquer atribuindo só salário
		for (int i = 0; i < 5; i++) {
			Funcionario f = new Funcionario();
			f.salario = 1000 + i * 100;
			empresa.adiciona(f);
		}
//chamada do método
		empresa.mostraEmpregados();
	}
}
maisongalvao144

Empresa

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Exercicios;
/*@author maison.souza*/

public class Empresa {

    public String nome;
    public int cnpj;
    public Funcionario[] empregados;

    public void adiciona(Funcionario f1) {
        boolean estacheio = true;
        for (int x = 0; x < empregados.length; x++) {
            if (empregados[x] == null) {
                estacheio = false;
                empregados[x] = f1;
                System.out.println( "Adicionado Funcionário  = " + this.empregados[x].nome);
                break;
            }
        }
        if (estacheio == true) {
            System.out.println("O vetor está cheio não foi possível adicionar " + f1.nome);
            Funcionario[] empregados2 = new Funcionario[this.empregados.length * 2];
            for (int i = 0; i < this.empregados.length; i++) {
                empregados2[i] = empregados[i];
            }
            for (int x = empregados.length; x < empregados2.length; x++) {
                if (empregados2[x] == null) {
                    empregados2[x] = f1;
                    System.out.println("Um novo vetor foi criado Adicionado Empregado  = " + empregados2[x].nome);
                    empregados = empregados2;
                    break;
                }
            }
        }
    }

    public boolean contem(Funcionario f1) {
        boolean contem;
        for (int x = 0; x < empregados.length; x++) {
            if (this.empregados[x] == f1) {
                System.out.println("Encontrado");
                contem = true;
                return true;
            }
        }
        System.out.println("Não trabalha");
        return false;
    }

    public void mostraEmpresa() {
        System.out.println("Nome da Empresa :" + this.nome);
        System.out.println("CNPJ: " + this.cnpj);
        mostraEmpregados();
    }

    public void mostraEmpregados() {
        for (int x = 0; x < this.empregados.length; x++) {
            if (empregados[x] != null) {
                System.out.println("Funcionario da posição " + x + " Funcionário = " + empregados[x].nome);
            }
        }
    }

    public void mostraDetalhes(Funcionario funcionario) {
        funcionario.mostraFuncionario();
    }
}
Funcionario
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Exercicios;

/**
 *
 * @author maison.souza
 */
public class Funcionario {

    public String nome;
    public String departamento;
    public int salario;
    public String dataentrada;
    public String rg;
    public Data data = new Data();

    public void bonifica(double quantidade) {
        this.salario += quantidade;
    }

    public int calculaGanhoAnual() {
        this.salario = this.salario * 12;
        return this.salario;
    }

    public void mostraFuncionario() {
        System.out.println("Nome = " + this.nome);
        System.out.println("Departamento = " + this.departamento);
        System.out.println("Data de Entrada = " + this.data.dia + "/" + this.data.mes + "/" + this.data.ano);
        System.out.println("Salário = " + this.salario);
        System.out.println("Ganho Anual: " + calculaGanhoAnual());
        System.out.println("Rg = " + this.rg);
    }
}
ViniGodoy

Por favor, evite ressuscitar tópicos. Ainda assim, se o fizer, deixe claro que está respondendo a um tópico antigo, não responda como se o usuário tivesse postado ontem.
Leia outras dicas de postagem em: http://www.guj.com.br/java/287476-gujnautas-how-to

maisongalvao144

Por favor, evite ressuscitar tópicos. Ainda assim, se o fizer, deixe claro que está respondendo a um tópico antigo, não responda como se o usuário tivesse postado ontem.
Leia outras dicas de postagem em: http://www.guj.com.br/java/287476-gujnautas-how-to

Ok Entendido. :slight_smile:

Criado 16 de março de 2011
Ultima resposta 25 de dez. de 2012
Respostas 24
Participantes 5