Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Obter o valor do salario com o método get

Olá, boa tarde! No exercício em questão, que é para mostrar o funcionario e seu respectivo salario, a resposta está como:

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

Não poderia obter o salario dos empregados através do seguinte trecho de código:

 for (int i =0; i<this.empregados.length; i++){
    System.out.println ("Funcionario nº" +(i+1)
                +"\nSeu salário: "+empregados[i].getSalario());
}

Além disso, como que ficaria a resposta usando a estrutura do foreach(ou enhanced for)?

Desde já agradeço a atenção e aguardo a resposta!

3 respostas

Olá, Marcos!

Se o método getSalario() tiver sido criado na classe Funcionario, poderia ser dessa forma sim.

Com foreach ficaria da seguinte forma:

int i = 0;
for (Funcionario f : this.empregados) {
    System.out.println(
        "Funcionario nº " + (++i) + "\nSeu salario: " f.getSalario()
    );
}

Mas há alguns pontos para se atentar.

Caso haja posições não preenchidas no array, este foreach resultará em um erro, pois ele percorrerá todas as posições reservadas do array.

Assim como a forma sugerida por você (utilizando .length ao invés de livre) também resultaria no mesmo erro.

Espero ter ajudado.

Abraços e bons estudos.

solução!

Marcos, a sua sugestão tem um problema. Não sabemos qual o último funcionário inserido, já que você não utilizou o atributo livre na condição do seu laço for. Isso vai causar uma exceção caso seu array de funcionários tenha alguma posição vazia.

Usando o foreach o código ficaria assim:

int i = 1;
for (Funcionario funcionario : this.empregados) {
  System.out.println ("Funcionario nº" +i);
  System.out.println ("Seu salário: " + funcionario.getSalario());
  i++;
}

Porém o problema da exceção vai continuar, então você precisaria conferir se o funcionário existe, assim:

int i = 1;
for (Funcionario funcionario : this.empregados) {
  if (funcionario != null) {
    System.out.println ("Funcionario nº" +i);
    System.out.println ("Seu salário: " + funcionario.getSalario());
  }
  i++;
}

As duas chamadas independentes ao System.out.println() deixam um pouco mais claro que o conteúdo será impresso em duas linhas. Mas pode ser feito em uma só sem problema algum! ;)

Arrays em java tem um tamanho pré-definido, por exemplo de um tamanho 100. Para que uma posição contenha uma instancia, ela deve receber um new. Ex empregado[posicao] = new Empregado(); A variável livre marca o índice do vetor que deverá receber um novo empregado, caso seja necessário. Usando o for com this.empregados.length, você vai percorrer todo o vetor, todavia este pode não estar completamente preenchido... e na hora que você tentar acessar uma posição não preenchida ocorrerá NullPointerException. Já usando a variável this.livre isso nunca ocorrerá, ja que como foi falado ela marca a ultima posicao livre, ou seja, percorrendo o array ate uma posição menor que livre ( i < this.livre), você garante que nao vai acessar nenhuma posição nao usada no array de empregados.

Usando o foreach ficaria assim :

int i = 0;
foreach(Empregado emp : this.empregados){
    if(emp != null){
        System.out.println ("Funcionario nº" + (++i));
            System.out.println ("Seu salário: " + emp.getSalario());
    }

}