Array referenciando objetos - JAVA

Busco ajuda para solucionar um problema relacionado a um array que faz referencia a um objeto “Funcionario”. Cada uma das classes abaixo funciona sozinha sem nenhuma mensagem de erro.
Porém, eu gostaria de adicionar um objeto “Funcionario” a um objeto “Empresa” que possui um array de referencias a objetos “Funcionario”

Aparentemente, não está funcionando


Ok, vamos por partes:

01) Depois de criar uma referencia a um objeto “Funcionario” na linha 7, eu uso o método “registerFuncionario” na linha 13 para preencher todos os atributos da classe.

02) Então eu crio uma referencia a um objeto “Empresa” na linha 8, e passo a referencia do objeto “Funcionario” para a referencia do objeto “Empresa” na linha 14.

03) Então, logo depois de passar o “Funcionario” como argumento para o método adicionarFuncionarios" eu tento imprimir todos os salarios dos funcionarios, passados anteriormente, e então o erro acontece:

Salario 1: Exception in thread “main” java.util.IllegalFormatConversionException: d != java.lang.Double
at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4302)
at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2793)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2747)
at java.util.Formatter.format(Formatter.java:2520)
at java.io.PrintStream.format(PrintStream.java:970)
at java.io.PrintStream.printf(PrintStream.java:871)
at banco.Empresa.printAllSalario(Empresa.java:49)
at banco.Teste.main(Teste.java:17)

Onde está o erro? Por favor, ajuda!

Código:

Classe funcionario:

import java.util.Scanner;

public class Funcionario {
	Scanner input = new Scanner(System.in);
	private double salario;
	private String nome;
	private String rg;
	private String dataAdmissao;

public void setSalario(double salarioF){
	this.salario = salarioF;
}

public void setNome(String nomeF){
	this.nome = nomeF;
}

public void setRg(String rgF){
	this.rg = rgF;
}

public void setDataAdmissao(String dataAdmissaoF){
	this.dataAdmissao = dataAdmissaoF;
}


public double getSalario(){
	return salario;
}

public String getNome(){
	return nome;
}

public String getRg(){
	return rg;
}

public String getDataAdmissao(){
	return dataAdmissao;
}

public void registerFuncionario(){
	System.out.print("Entre com o nome do funcionario: ");
	setNome(input.nextLine());
	input = new Scanner(System.in);
	System.out.print("Entre com o RG do funcionario: ");
	setRg(input.nextLine());
	input = new Scanner(System.in);
	System.out.print("Entre com a data de admissao do funcionario: ");
	setDataAdmissao(input.nextLine());
	input = new Scanner(System.in);
	System.out.print("Entre com o salario do funcionario: ");
	setSalario(input.nextDouble());
	input = new Scanner(System.in);
}

public void printFuncionarioInfo(){
	System.out.println("Nome do funcionario: "+getNome());
	System.out.println("RG do funcionario: "+getRg());
	System.out.println("Data de admissao do funcionario: "+getDataAdmissao());
	System.out.println("Salario do funcionario: "+getSalario());
}

}

Classe Empresa:

import java.util.Scanner;

public class Empresa {
	Scanner input = new Scanner(System.in);
	private String nomeEmpresa;
	private String cnpj;
	Funcionario empregados[];

public void setNomeEmrpesa(String nomeEmpresa){
	this.nomeEmpresa = nomeEmpresa;
}

public void setCnpj(String cnpj){
	this.cnpj = cnpj;
}

public String getNomeEmpresa(){
	return nomeEmpresa;
}

public String getCnpj(){
	return cnpj;
}

public void registerEmpresa(){
	System.out.print("Nome da Empresa: ");
	setNomeEmrpesa(input.nextLine());
	System.out.print("CNPJ: ");
	setCnpj(input.nextLine());
}

public void printEmpresaInfo(){
	System.out.println("Nome da empresa: "+nomeEmpresa);
	System.out.println("CNPJ: "+cnpj);
}

public void adicionarFuncionario(Funcionario k){
	int i=0;
	while(empregados[i] != null)
		i++;
	empregados[i] = new Funcionario();
	empregados[i] = k;
}

public void printAllSalario(){
	for(int i=0; empregados[i] != null; i++){		
		System.out.printf("Salario %d: %d", (i+1), empregados[i].getSalario());
	}
}

}


 Classe Teste "contendo o método main" :


public class Teste {

public static void main(String[] args){

	Funcionario empregado = new Funcionario();
	Empresa empresa1 = new Empresa();
	
	empresa1.empregados = new Funcionario[3];
	for(int i =0; i<empresa1.empregados.length; i++){
		System.out.printf("Cadastrando o funcionario %d\n", (i+1));
		empregado.registerFuncionario();
		empresa1.adicionarFuncionario(empregado);
	}
	
	empresa1.printAllSalario();
}//fim do main
}//fim da classe

Bom aparentemente é uma exceção na conversão da string refente ao salário em double. Verifique se ao digitar o valor do salário está utilizando “.” em vez “,” pois o mesmo resultará em uma exceção de conversão.

Matheus estou entrando com um numero inteiro no campo do salário, então acho pouco provável que seja este o erro.

Obrigado.

Talvez seja isto tente usar assim ex: 1.0

Não pode ser Matheus, pois como eu disse, os métodos estão funcionando separadamente.
Ou seja, se eu uso o método printFuncionarioInfo da classe “Funcionario”, o salario é impresso e nenhum erro é exibido.
Acredito que o erro ocorra ao passar o Funcionario como argumento na linha 14. Mas precisaria descobrir o por que, e a sintaxe correta para essa instrução. Ou melhor, qual instrução eu deveria usar para substituir esta, tendo em vista que eu não esteja passando nada para o array[i].

O problema ero o seguinte método

public void printAllSalario() {
    for (int i = 0; i < empregados.length; i++) {
 // for (int i = 0; empregados[i] != null; i++) {
        System.out.printf("Salario %d: %2f", (i + 1), empregados[i].getSalario());
  //      System.out.printf("Salario %d: %d", (i + 1), empregados[i].getSalario());
    }
}

Primeiro repara a linha do printf. Você estava usando %d como parametro. Porém %d é somente usado para números inteiros. Aí onde dava a exceção de conversão para double.

Alterei para %2f que é usado para double.(Nota. %f para float)

E quanto a linha do for faça o teste na última iteração você irá incrementar seu contador para um número acima do tamanho de seu array. Resultando em uma exceção de indice fora do array.
java.lang.ArrayIndexOutOfBoundsException: 3

Espero ter ajudado abraço.

1 curtida

Rahmon_Marcossi, so uma dica: você pode usar o toString() na classe funcionario e empresa.
Veja como ficaria mais simples para exibir.

como está:

public void printAllSalario(){
	for(int i=0; empregados[i] != null; i++){		
		System.out.printf("Salario %d: %d", (i+1), empregados[i].getSalario());
	}
}

Como ficaria:

System.out.print(funcionario);
System.out.print(empresa);
1 curtida

Ajudou demais Matheus, obrigado fera! Abraço.

Obrigado pela dica Jonas, valeu fera! Abraço.