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

Erro na compilação

Minha Classe:

class TestaFuncionario {
  public static void main (String[] args) {

    Funcionario f = new Funcionario();
    f.setSalario(1000.0);

    System.out.println("Salario de f: " + f.getSalario());
  }

}

O erro acusado:

TestaEmpresa.java:7: error: cannot find symbol
    f.setSalario(1000.0);
     ^
  symbol:   method setSalario(double)
  location: variable f of type Funcionario
TestaEmpresa.java:9: error: cannot find symbol
    System.out.println("Salario de f: " + f.getSalario());
                                           ^
  symbol:   method getSalario()
  location: variable f of type Funcionario
2 errors
31 respostas

Geovane o seu metodo salario na classe funcionario passa como parametro um tipo double? Se sim coloca assim.

 f.setSalario(1000.0D);
ou
 f.setSalario(1000.0d);

Posta a classe Funcionario aqui para gente dar uma olhada.

class Funcionario {
  private String nome;
  private String RG;
  private String departamento;
  private String funcao;
  private double salario;
  private Data dataEntrada = new Data();

  public String getNome() {
    return this.nome;
  }

  public String getRG() {
    return this.RG;
  }

  public String getDepartamento() {
    return this.departamento;
  }

  public String getFuncao() {
    return this.funcao;
  }

  public double getSalario() {
    return this.salario;
  }

  public Data getDataEntrada() {
    return this.dataEntrada;
  }

  public double getGanhoAnual() {
    return this.salario * 12;
  }

  public void getMostra() {
    System.out.println("Nome: " + this.nome);
    System.out.println("RG: " + this.RG);
    System.out.println("Funcao: " + this.funcao);
    System.out.println("Departamento: " + this.departamento);
    System.out.println("Salario: " + this.salario);
    System.out.println("Data: " + this.dataEntrada.getDataFormatada());
    System.out.println("");
  }

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

  public void setRG(String identidade) {
    this.RG = identidade;
  }

  public void setDepartamento(String depto) {
    this.departamento = depto;
  }

  public void setFuncao(String cargo) {
    this.funcao = cargo;
  }

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

  public void setDataEntrada(Data dataE) {
    this.dataEntrada = dataE;
  }

  public double setAumentoSalario(double percentualAumento) {
    this.salario += (salario * percentualAumento);
  }
}

Então eu acho que o erro é esse mesmo, usa umas das formas que te falei e veja se funciona.

f.setSalario(1000.0D);
ou
 f.setSalario(1000.0d);

Allison,

Entendi. Antes eu passava o meu parâmetro como inteiro (1000) e não dava esse problema (o meu atributo ainda sendo double). Agora, por que eu preciso especificar com que é double se o meu atributo já é double?

Também consegui compilar, mas não foi exibido nada.

Sim por causa que é um double você tem que colocar esse d chato ai sim, ta mais agora não gerou erro? Se gerou posta aqui o erro.

Não gerou. Mandei (1000). Só que a minha linha do System.out.println... não tá executando.

Veja que não tem erro:

C:\Users\Geovane\Desktop\Alura\java\Empresa>javac TestaEmpresa.java

C:\Users\Geovane\Desktop\Alura\java\Empresa>java TestaEmpresa

C:\Users\Geovane\Desktop\Alura\java\Empresa>

Geovane olhando seu código olha o seu método.

public double setAumentoSalario(double percentualAumento) {
    this.salario += (salario * percentualAumento);
  }

Você está falando que ele tem um retorno double então você tem que retorna algo, só não usamos a palavra return quando seu metodo é void sem retorno. Ajusta ele assim.

public double setAumentoSalario(double percentualAumento) {
    return this.salario += (salario * percentualAumento);
  }

Ve se agora foi, e também coloca na sua classe Funcionario coloca assim.

public class Funcionario  {

acrescenta o public

Ok, vou corrigir. Mas o método que estou chamando é esse:

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

Continua não aparecendo.

Geovane então é algo no javac.

Será? Eu tenho outras classes, uma delas é a classe Empresa.

class Empresa {
  private String nome;
  private String cnpj;
  private String endereco;
  private Funcionario empregados[] = new Funcionario[10];
  private int livre = 0;

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

  public String getNome() {
    return this.nome;
  }

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

  public String getCnpj() {
    return this.cnpj;
  }

  public void setEndereço(String endereco) {
    this.endereco = endereco;
  }

  public String getEndereco() {
    return this.endereco;
  }

  public Funcionario getFuncionario(int posicao) {
    return this.empregados[posicao];
  }

  void adiciona(Funcionario f) {
    this.empregados[this.livre] = f;
    this.livre++;
  }

  void mostraEmpregados() {
    for(int i = 0; i < this.empregados.length; i++) {
      System.out.println("Nome: " + this.empregados[i].nome);
      System.out.println("RG: " + this.empregados[i].RG);
      System.out.println("Funcao: " + this.empregados[i].funcao);
      System.out.println("Departamento: " + this.empregados[i].departamento);
      System.out.println("Salario: " + this.empregados[i].salario);
      System.out.println("Data: " + this.empregados[i].dataEntrada.getDataFormatada());
      System.out.println("");
    }
  }

  void mostraTodasAsInformacoes() {
    for (int i = 0; i < this.livre; i++) {
      System.out.println("Funcionario: " + i);
      this.empregados[i].mostra();
    }
  }

  boolean contem(Funcionario f) {
    for (int i = 0; i < this.livre; i++) {
      if (f == this.empregados[i]) {
        return true;
      }
    }
    return false;
  }
}

Ela não poderia estar interferindo em algo? meu atributo empregados tem alguma relação?

Veja que em uma outra pasta em consigo compilar e executar:

 Pasta de C:\Users\Geovane\Desktop\Alura\java\cliente

19/04/2017  08:46    <DIR>          .
19/04/2017  08:46    <DIR>          ..
25/04/2017  17:19               237 Cliente.class
19/04/2017  08:43                50 Cliente.java
25/04/2017  17:19             1.038 Conta.class
19/04/2017  15:16               595 Conta.java
25/04/2017  17:19               446 TestaConta.class
24/04/2017  20:57               238 TestaConta.java
               6 arquivo(s)          2.604 bytes
               2 pasta(s)   107.005.538.304 bytes disponíveis

C:\Users\Geovane\Desktop\Alura\java\cliente>java TestaConta
Saldo: R$ 800.0
Limite: R$ 1000.0

C:\Users\Geovane\Desktop\Alura\java\cliente>

Você tem alguma classe chamada TestaEmpresa?

Ta dando algum erro na classe TestaEmpresa, você tem essa classe? Ou tinha ou troco de nome? algo assim?

Estava fazendo confusão com os nomes das classes.

O erro persiste:

C:\Users\Geovane\Desktop\Alura\java\Empresa>javac aula3.java
aula3.java:5: error: cannot find symbol
    f.setSalario(1000.0D);
     ^
  symbol:   method setSalario(double)
  location: variable f of type Funcionario
aula3.java:7: error: cannot find symbol
    System.out.println("Salario de f: " + f.getSalario());
                                           ^
  symbol:   method getSalario()
  location: variable f of type Funcionario
2 errors

C:\Users\Geovane\Desktop\Alura\java\Empresa>

Oi Geovane eu peguei as suas classes e criei um projeto, rodei aqui no Eclipse e elas funcionaram normalmente sem a necessidade de casting nenhum, você salvou a sua classe antes de rodar ? Aperte

CTRL + SHIFT + S

Para salvar quaisquer alterações e então rode o seu TestaFuncionario NOVAMENTE, mas antes lembre-se que para sua classe compilar certinho ela não pode ter erros de compilação, por isso antes ajeita os métodos que tem retorno com a palavra chave return aí quando sua classe não tiver acusando erro nenhum aí você roda o projeto. Você tá utilizando o prompt de comando se sim você deve entrar n pasta onde suas classes Funcionario e TestaFuncionario estão.Para navegar pelo cmd utilize o comando dir (visualizar) e cd (navegar) Ex:

cd Desktop\Nova Pasta\javac Funcioanario.java

e depois execute javac TestaFuncioanario.java E POR FIM

java TestaFuncionario.java

Hum então não era a classe Funcionario e TestaFuncionario e sim aula3 conforme você tá mostrando, posta a Classe aula 3 para verificarmos, mas antes lembre-se que por convenções de boas práticas utilizamos letras Máiusculas em nomes de classes.

javac Aula3.java

Fico no aguardo

Você diz que o meu arquivo aula3.java deve estar assim: Aula3.java?

bom, veja que eu estou tentando compilar o arquivo aula3.java.Se compilasse, geraria o arquivo TestaFuncionario.class, certo? Mas não compila.

C:\Users\Geovane\Desktop\Alura\java\Empresa>javac aula3.java
aula3.java:5: error: cannot find symbol
    f.setSalario(1000.0);
     ^
  symbol:   method setSalario(double)
  location: variable f of type Funcionario
aula3.java:7: error: cannot find symbol
    System.out.println("Salario de f: " + f.getSalario());
                                           ^
  symbol:   method getSalario()
  location: variable f of type Funcionario
2 errors

Nesse arquivo está a minha classe TestaFuncionario, que é este código:

class TestaFuncionario {
  public static void main (String[] args) {

    Funcionario f = new Funcionario();
    f.setSalario(1000.0);

    System.out.println("Salario de f: " + f.getSalario());

    //f.getMostra();
  }

}

Esta classe já se chamou AulaTres, mas o seu nome foi alterado para TestaFuncionario nesta aula.

Então Geovane é o seguinte você não precisa que seu nome do arquivo seja o mesmo nome da classe certo, mas, porém, contudo, todavia como você tava falando da classe TestaFuncionario, depoisTestaEmpresa, depois Empresa, Funcionario por fim AulaTres, perceba que isso pode te causar um transtorno pois você pode tá compilando a classe errada, ou não sabendo quem é quem, por isso que tradicionalmente fazemos assim em um arquivo:

class Funcionario {
  private String nome;
  private String RG;
  private String departamento;
  private String funcao;
  private double salario;
  private Data dataEntrada = new Data();

  public String getNome() {
    return this.nome;
  }

  public String getRG() {
    return this.RG;
  }

  public String getDepartamento() {
    return this.departamento;
  }

  public String getFuncao() {
    return this.funcao;
  }

  public double getSalario() {
    return this.salario;
  }

  public Data getDataEntrada() {
    return this.dataEntrada;
  }

  public double getGanhoAnual() {
    return this.salario * 12;
  }

  public void getMostra() {
    System.out.println("Nome: " + this.nome);
    System.out.println("RG: " + this.RG);
    System.out.println("Funcao: " + this.funcao);
    System.out.println("Departamento: " + this.departamento);
    System.out.println("Salario: " + this.salario);
    System.out.println("Data: " + this.dataEntrada.getDataFormatada());
    System.out.println("");
  }

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

  public void setRG(String identidade) {
    this.RG = identidade;
  }

  public void setDepartamento(String depto) {
    this.departamento = depto;
  }

  public void setFuncao(String cargo) {
    this.funcao = cargo;
  }

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

  public void setDataEntrada(Data dataE) {
    this.dataEntrada = dataE;
  }

  public double setAumentoSalario(double percentualAumento) {
    this.salario += (salario * percentualAumento);
  }
}

e em outro

class TestaFuncionario {
  public static void main (String[] args) {

    Funcionario f = new Funcionario();
    f.setSalario(1000.0);

    System.out.println("Salario de f: " + f.getSalario());
  }

}

E como você tá usando o cmd seria interessante que elas estivessem no mesmo diretório, aí você compilava com o javac uma de cada vez e depois Rodava somente a TestaFuncionario por conter o método main.

Além disso lembre-se dessas dicas importantes quando você utilizar arquivos com mais de uma classe e com nomes diferentes:

  • Cada arquivo .java deve conter apenas uma classe pública.

  • Caso uma classe tenha o modificador de acesso public, ela deve ter o mesmo nome do arquivo .java.

  • Podemos ter mais de uma classe declarada em um mesmo arquivo.

Talvez o que falte é só você colocar o public dependendo de como tá esse arquivo aula3, posta o aula3 para analisarmos. Fico no aguardo.

Olha só cara, o meu arquivo aula3 é a minha classe TestaFuncionario (que já postei aqui). E também cada classe está em um arquivo separado.

Veja também que todos estão em uma mesma pasta


 Pasta de C:\Users\Geovane\Desktop\Alura\java\Empresa

26/04/2017  23:05    <DIR>          .
26/04/2017  23:05    <DIR>          ..
26/04/2017  23:05               236 aula3.java
18/04/2017  09:30               640 Data.class
15/04/2017  08:54               268 data.java
18/04/2017  09:30             1.739 Empresa.class
25/04/2017  14:58             1.697 Empresa.java
18/04/2017  09:30             1.281 Funcionario.class
26/04/2017  23:06             1.651 funcionario.java
25/04/2017  17:13               269 TestaEmpresa.class
25/04/2017  14:49               165 TestaEmpresa.java
               9 arquivo(s)          7.946 bytes
               2 pasta(s)   106.125.721.600 bytes disponíveis

O que o Java acusa como erro é que ele não está encontrando os meus métodos. Agora, por quê?

Veja: cannot find symbol

C:\Users\Geovane\Desktop\Alura\java\Empresa>javac aula3.java
aula3.java:5: error: cannot find symbol
    f.setSalario(1000.0);
     ^
  symbol:   method setSalario(double)
  location: variable f of type Funcionario
aula3.java:7: error: cannot find symbol
    System.out.println("Salario de f: " + f.getSalario());
                                           ^
  symbol:   method getSalario()
  location: variable f of type Funcionario
2 errors

Oi Geovane faz essas alterações altere o nome do seu arquivo aula3.java para TestaFuncionario.java, feito isso abra o arquivo e altere de

class TestaFuncionario

para

public class TestaFuncionario{

salve as mudanças e compile o arquivo

javac TestaFuncionario.java

e depois execute

java TestaFuncionario

Fico no aguardo.

eu desisto cara. Não compila.

Calma Geovane, talvez somente nos 2 últimos posts ficou claro qual era a dificuldade da dúvida, você fez as alterações sugeridas ? posta ai como ficou sua classe TestaFuncionario ok.

Fiz

public class TestaFuncionario {
  public static void main (String[] args) {

    Funcionario f = new Funcionario();
    f.setSalario(1000.0);

    System.out.println("Salario de f: " + f.getSalario());

    //f.getMostra();
  }

}

Altere o aquivo de funcionario.java para

Funcionario.java

Altere tmb nesse mesmo arquivo de

class Funcionario

para

public class Funcionario

salve e execute no cmd o comando para compilar a classe Funcionario:

javac Funcionario

Em caso de erro poste aqui. Caso não dê erro compile o TestaFuncionario com:

javac TestaFuncionario

Ok, compilou e executou. Mas será que talvez não fosse um problema apenas de compilação? Veja que eu estava compilando só o arquivo TestaFuncionario.java, mas nele havia métodos que acessavam a classe Funcionario, no arquivo Funcionario.java. Pois, dessa vez fiz a compilação de todos arquivos através do comando javac *java. Faz sentido?

solução!

Oi Geovane para que a máquina virtual java consiga executar seu programa primeiramente o compilador vai fazer uma varredura nele procurando por erros caso ele não ache ele compila, no seu caso acredito que foi o seguinte NomeDoArquivo diferente do NomeDaClasse e sem public (aula3 & TestaFuncionario), classe principal sem public(class TestaFuncionario ao inves de public class) e na sua classe funcionario você tinha um método double que não retornava nada chamado setAumentoSalario, se nada disso tiver nos conformes a classe Funcionario não compila se ela não compila não adianta Testar ela com outra classe (TestaFuncionario) pois não conseguiremos acessar seus atributos e métodos.

Para que uma instância de uma classe possa ser criada por qualquer outra classe, a classe em questão deve ser declarada pública, o que é feito acrescentando-se a palavra chave public à declaração da classe:

public class NomeDaClasse{ 
   ... 
}

Classes que constituem aplicativos independentes e applets devem ser públicas. Uma classe que não for declarada pública somente poderá ser acessada por outras classes do mesmo pacote. Deve-se notar que cada arquivo fonte pode conter somente uma classe pública. Caso o arquivo contenha uma classe pública, ele deve possuir o mesmo nome que esta classe, com a terminação .java.

Caso persista alguma dúvida a respeito desse exercício ou curso pode perguntar aqui mesmo ou se você não tiver mais nenhuma dúvida a respeito você pode marcar uma resposta como solução, finalizando assim esse tópico.Espero ter ajudado. Bons estudos.