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();
}
}
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().
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);
[/quote]
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().[/quote]
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)
[quote=gRoOve]Então o erro é este mesmo que eu apontei, no método main você chama empresa.mostra();
É isso ai, espero ter ajudado.[/quote]
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
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.
[quote=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.[/quote]
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.
[code]void mostraEmpresa() {
for (int i = 0; i < this.empregados.length; i++){
if(this.empregados[i] == null)
continue;
[quote=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.[/quote]
Deu certo aqui, instanciei a class Data e funfo beleza. muito obrigado, sua ajuda foi de grande importância!!! Abraços
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!
[code]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();
}
} [/code] 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
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”.
Então, fiquei tentando aqui sozinho e fiz o seguinte. Eu instanciei um objeto Data para cada objeto Funcionario na classe TestaFuncionario.
[code]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;[/code]
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
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”.
É 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 há 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.
[quote=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.[/quote]
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.
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.
[quote=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.[/quote]
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.