[RESOLVIDO]Erro: cannot find symbol - Classe não encontrada - Exercicio Caelum

20 respostas
D

Olá pessoal!

Estou iniciando meus estudos com Java através da apostila da Caelum e ao tentar resolver o exercício 02 do 4º capítulo me deparei com o seguinte problema:

cannot find symbol
symbol: class Funcionario
location: class Praticas_de_Java.TestaFuncionario
Funcionario f = new Funcionario();
^

Segue o enunciado da questão:

2) Transforme o modelo acima em uma classe Java(exercicio para modular um funcionário). Teste-a, usando uma outra classe que tenha o main. Você
deve criar a classe do funcionário chamada Funcionario, e a classe de teste você pode nomear como quiser.
A de teste deve possuir o método main.

Já pesquisei em vários tópicos da GUJ que constavam o mesmo problema, tentei todas as instruções que foram passadas, mas não obtive êxito quanto a solução.

Os arquivos estão na mesma pasta: Praticas_de_Java e com os nomes idênticos ao das classes correspondentes, mas ao compilar a classe TestaFuncionario o erro citado acima aparece. Não estou usando IDE, a compilação é feita através do DOS.

Se alguém puder me ajudar ficarei grata!!!

Seguem abaixo os códigos que eu fiz, para análise.

public class Funcionario{

	String nome;
	String departamento;
	String dataEntrada;
	double salario;
	String rg;
	boolean ativo = true;
	
	void bonifica(double aumento){
		this.salario += aumento;
	
	}
	
	void demite(){
		if(ativo)
			this.ativo = false;
		else
			System.out.println("Funcionário não faz mais parte da empresa");
	
	}
	
	}
}
public class TestaFuncionario{

	public static void main(String[] args){
		
		Funcionario f = new Funcionario();
		
		f.nome = "Roberto";
		f.departamento = "Informatica";
		f.dataEntrada = "25/02/2013";
		f.salario = 1200;
		f.rg = "200400100493";
		f.ativo = true;
		
		f.bonifica(200);
		f.demite();
		
		System.out.println(f.salario);
		
	
	
	}

}

20 Respostas

L

Copiei seu código aqui, executei e funcionou, porém tinha um ‘}’ a mais na classe Funcionário.

Quando o erro ocorre?

D

Uhm…suspeitei Lucas.

Acredito que seja algum problema de configuração do classpath =\

Quando eu compilo a classe TestaFuncionário é que aparece esse erro. Eu coloquei o main dentro da classe Funcionário e compilou direitinho, mas apareceu outro erro na execução:

Could not find the main class: Funcionario. Program will exit

E

Corrigiu o erro na classe Funcionario?

Ao executar o programa por acaso esta escrevendo:
java TestaFuncionario
sem o “.class”?

D

Sim Erick. Retirei o } a mais da classe Funcionario. Porém o erro continua.

Ao compilar eu uso javac TestaFuncionario.java e ao executar eu uso java -cp . TestaFuncionario

Uso assim pois sem isso (-cp . ) ele nao funciona.

Será algum problema com a jdk?

D

Na verdade nao chego nem a executar, por que ele não compila =\

Já tentei separar os arquivos em outros diretorios e importá-los, mas tbm não deu certo.

Já pesquisei em tudo que foi site e nada, nenhumas das soluções resolveu meu problema.

Ah meninos, obrigada por tentarem me ajudar!

L

Você ta usando que IDE? Ou tá fazendo pelo bloco de notas e compilando no prompt?

D

Não estou usando IDE. Estou usando o notepad++ mesmo e compilando no prompt.

E

Aparece algum erro?(se sim poste a mensagem)

De qualquer forma tente compilar a classe Funcionario e depois a Classe TesteFuncionario.

Aparentemente parece ser um erro de classpath (ou outros códigos compilam/executam normalmente?)

L

Putz, eu não lembro muito de como usar com o prompt… Se não me engano, tem umas regrinhas que devem ser seguidas para que funcione… Não lembro muito bem, faz muito tempo. Da uma procurada no google.

D

Lukas já pesquisei, e já usei o -cp com tudo que foi jeito, usando o caminho do diretório completo ou com o . ;\

Configurei as variáveis do sistema conforme as recomendações. Todos os outros exercicios foram feitos da mesma forma e não deram nenhum erro.

Erick já fiz isso também. Minha última esperança é aqui no GUJ, já cansei de pesquisar no google ;(

V

da uma olha você não colocou a variáveis como “public” isso pode causar erro SE e somente se a classe que contem o “public static void main(String… args)” estiver em um pacote diferente da sua classe funcionário mais ou menos assim

caminho completo para funcionário (Exemplo)
Empresa.Funcionario

caminho completo para a classe TesteFuncionario
Teste.TesteFuncionario

Se não me engano quando você não declara o marcador de visibilidade (public,protected ou private) o campo é visível a todos as classe que estiverem no mesmo pacote.

Não tenho 100% de certeza disso mas devo estar com uns 95% de certeza xD vou da uma olhada

V

ha como eu disse aki :
http://www.tiexpert.net/programacao/java/public-private-protected.php

se n tiver o marcador de visibilidade ele fica limitado ao pacote

E

Acho que o modo que vai dar menos dor de cabeça será desinstalar o JDK e instalar novamente.

De qualquer forma poste o erro que aparece.

D

Victor eles estão no mesmo diretório, mas mesmo assim tentei…nao deu certo.

D
cannot find symbol

symbol  : class Funcionario

location: class Praticas_de_Java.TestaFuncionario

Funcionario f = new Funcionario();

^

cannot find symbol

symbol  : class Funcionario

location: class Praticas_de_Java.TestaFuncionario

Funcionario f = new Funcionario();

^

2 errors
V

ok eu acabei de testar as classes não obtive erro nenhum na hora de copilar eu fiz assim

$ javac Funcionario.java TestaFuncionario.java

e na hora de executar normal

$ java TestaFuncionario

funcionou sem problemas

claro que eu tomei cuidado com a chave extra que tem no seu código

D

Deu certo ao compilar agora, tirando o $ que não estava reconhecendo, compilou direitinho. Obrigada Victor!!

Agora deu problema na hora de executar :frowning:

Exception in thread main java.lang.NoClassDefFoundError: TestaFuncionario

Caused by: java.lang.ClassNotFoundException: TestaFuncionario

at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

Could not find the main class: TestaFuncionario.  Program will exit.
V

eu conseguir obter o mesmo erro que você (isso é uma boa noticia)

bem na hora de copilar se você passar um dos parâmetros errado ele vai da erro , por exemplo se você passar para o javac o nome de uma pasta foi assim que eu fiz der o erro

1º criei uma pasta chamado T
2º na hora de copilar eu chamei a pasta ao invés do arquivo que ela contem (EX :blush: javac T)

V

hue que sorte tentando gerar o outro erro eu também fiz esse erro que você mostrou ai sem querer

bem ele ocorreu por causa que os arquivos não estão na mesma pasta quando eu criei essa pasta T e copilei assim

$ javac TestaFuncionario.java T/Funcionario.java

isso dará erro por que o java não irá achar a classe Funcionario

D

Daniy_SzAraujo:
Sim Erick. Retirei o } a mais da classe Funcionario. Porém o erro continua.

Ao compilar eu uso javac TestaFuncionario.java e ao executar eu uso java -cp . TestaFuncionario

Uso assim pois sem isso (-cp . ) ele nao funciona.

Será algum problema com a jdk?

Pessoal pesquisando um pouco mais sobre, encontrei o seguinte:

"Algo que frequentemente ocorre quando os desenvolvedores compilam e rodam a aplicação pela linha de comando, é se deparar com um erro de Classe não encontrada. Isto geralmente é resolvido quando adicionamos o diretório atual na busca. Desta forma, o javac ou java irá procurar em todas os subdiretórios da pasta atual. Para fazer isto, é necessário adicionar o ponto ?.? em um dos diretórios definidos após o comando -cp . "

Logo, tanto para compilar quanto para executar é preciso inserir -cp . TestaFuncionario, dessa forma:

[b]
javac -cp . TestaFuncionario.java

java -cp . TestaFuncionario[/b]

Assim foi possivel compilar e executar normalmente, sem erro. Portanto consegui resolver o meu problema \o//// ;D

Outra coisa que eu encontrei e que achei bastante interessante compartilhar com vocês, foi a questão de separar os arquivos .class dos arquivos .java, por questão de organização. Para isso é preciso criar uma pasta classes dentro da pasta onde está o seu arquivo .java. Sendo assim, ao compilar a classe deve-se usar a seguinte instrução:

javac -d classes Funcionario.java

O -d irá informar ao compilador para inserir o arquivo .class em um local determinado: dentro do diretório classes.

Já ao compilar a classe TestaFuncionario foi preciso inserir também o -cp ./classes, pois ele irá buscar nesse diretório (classes) a classe necessária para a execução do comando.

javac -d classes -cp ./classes TestaFuncionario.java

Para executar basta inserir o comando abaixo:

java -cp ./classes TesteFuncionario

Obrigada a todos que me ajudaram!!! :smiley:

Criado 3 de julho de 2013
Ultima resposta 4 de jul. de 2013
Respostas 20
Participantes 4