Olá. Estou estudando um livro de Java de 2002 e estou no capítulo de criação de métodos. Porém, nenhum dos exemplos do livro que tento executar estão funcionando, apesar de serem compilados sem problemas. Acredito que alguma coisa mudou desde a publicação do livro na linguagem. O exemplo mais simples e que certamente deve englobar essa mudança é:
<blockquote>classExemplo0501{publicstaticvoidmain(Stringargs[]){imprime();// invocação do método}publicstaticvoidimprime(){System.out.println(“AprendendoaLinguagemJava”);}}</blockquote>
Erro:
Não foi possível localizar nem carregar a classe principal Exemplo0501
O que eu teria de fazer (o que mudou) para que este simples exemplo funcione?
como você está compilando o arquivo .java? Está usando alguma IDE ?
D
doraimom
terminal do windows.
Rodrigo_Sasaki
o .class foi gerado corretamente? com que linha de comando você está tentando executar a classe ?
D
doraimom
Oi. Como eu disse estou conseguindo compilar sem problemas. É gerado o arquivo .class.
Estou rodando pelo terminal DOS do windows.
Comando:
java Exemplo0501
Obrigado.
P.S.: O livro inteiro foi feito para rodar pelo DOS. Java 2 Ensino Didático - Sérgio Furgeri
A
Alberes
Só confirma se o nome do arquivo é Exemplo0501.java
O nome do arquivo e a declaração “class Exemplo0501” devem ser iguais.
Rodrigo_Sasaki
estranho… se as variáveis de ambiente estivessem erradas, você sequer conseguiria compilar (eu acho).
se você estiver no mesmo diretório que o arquivo, esse comando deveria funcionar.
D
doraimom
Nome do arquivo: Exemplo0501.java
Nome da classe dentro do arquivo java acima: class Exemplo0501
Comando no terminal para rodar Exemplo0501.class: java Exemplo0501
D
doraimom
Como falei acredito que algo na linguagem mudou para o exemplo parar de funcionar. Não acredito que seja nenhum problema meu de execução do programa. O mesmo tipo de erro acontece nos outros exemplos mais complexos deste capítulo. É um erro relacionado aos métodos criados. O capítulo inteiro é sobre isso.
Rodrigo_Sasaki
a linguagem não mudou, eu fiz um exemplo idêntico ao seu, compilei pelo cmd do Windows e ele rodou normalmente.
Um dos detalhes importantes do Java é que ele não quebra compatibilidade, não sei se alguém saberia um exemplo onde a compatibilidade foi quebrada, mas eu não conheço.
Por isso que existe o Erasure de Generics, e classes como StringTokenizer existem até hoje.
D
doraimom
Bom, se nada mudou, se você souber me dizer o porque deste exemplo não estar funcionando aqui e como eu corrijo ele, fica tudo certo.
Só os exemplos deste capítulo 5 que não funcionam (não é problema do exemplo 0501 especificamente). Todos os exemplos dos capítulos de 1 a 4 funcionaram perfeitamente e eu estou seguindo o mesmo procedimento para compilar e rodar todos os exemplos do livro. Obrigado.
Rodrigo_Sasaki
você pode verificar suas variáveis de ambiente.
verifique se as variáveis Path, e CLASSPATH estão corretas, talvez a JAVA_HOME também.
E
entanglement
A partir do Java 5, é necessário explicitar o classpath para rodar um programa (ou então configurar a variável de ambiente CLASSPATH, mas isso causa mais problemas que os resolve.
Seu programa, se você o compilou na linha de comando, deve rodar com:
java-cp.Exemplo0501
Rodrigo_Sasaki
entanglement:
A partir do Java 5, é necessário explicitar o classpath para rodar um programa (ou então configurar a variável de ambiente CLASSPATH, mas isso causa mais problemas que os resolve.
Seu programa, se você o compilou na linha de comando, deve rodar com:
java -cp . Exemplo0501
Interessante…
Mas ele conseguiria compilar sem especificar o classpath dessa maneira? caso a variável não esteja especificada?
D
doraimom
Oi.
java -cp . Exemplo0501 funcionou.
Só não está claro pra mim qual era o erro; por que não deu certo do jeito do livro?
Na foto do livro o autor executou o programa exatamente como eu fiz, sem este cp e sem este ponto que eu inicialmente tinha achado que fosse um erro de digitação.
Quanto ao classpath, etc. isso foi feito seguindo as instruções do autor lá antes de começar o primeiro capítulo do livro. Se tivesse setado errado o javac nem estaria funcionando, pois eu não estou rodando os arquivos de dentro da pasta java, mas de uma pasta que criei no desktop.
Seriam essas minhas dúvidas. Queria entender o que aconteceu e saber o que eu teria de fazer para funcionar sem o cp. Obrigado
Oi.
java -cp . Exemplo0501 funcionou.
Só não está claro pra mim qual era o erro; por que não deu certo do jeito do livro?
Porque em 2002 o Java estava na versão 1.3 (em fevereiro, apareceu a versão 1.4) e nessa versão o diretório corrente era pesquisado para procurar as classes (é o que o comando "-cp . " faz. )
A partir da versão 5.0, que apareceu em 2004, o diretório corrente, por motivos de segurança, passou a não ser mais pesquisado por default. E é por isso que o exemplo do livro requer um "-cp . " agora para funcionar.
Não está errado você usar um livro tão antigo assim, mas é bom tomar cuidado porque algumas coisas bobas podem ocorrer. Uma delas, por exemplo, é isso que ocorreu com você.
E
entanglement
Aliás, a variável JAVA_HOME não é usada pelo java.exe (que é o que você está usando para rodar seu programa de teste); ela costuma ser usada por outros programas, como o Tomcat, que precisam saber onde estão as outras bibliotecas do Java para rodarem.
D
doraimom
E o ponto depois do -cp pra que serve?
A respeito da sua explicação sobre o -cp eu não entendi o seguinte:
1º) O java reclamava que não conseguia carregar a classe Exemplo0501. Mas a classe está no mesmo lugar que todas as outras classes dos capítulos anteriores estavam. Por que deu erro agora?
2º) O erro não está no método que eu criei dentro da classe? Se for eu não entendo porque não funcionou, pois eu não mandei ele buscar um método externo à classe. O método estava dentro da classe e dentro do mesmo arquivo .java. Se ele consegue achar e ler os outros métodos por que não consegue ler o que eu criei se está no mesmo lugar, dentro do mesmo arquivo?
Não mudou nada. Continua sem funcionar. Só funciona com o -cp.
Rodrigo_Sasaki
o entanglement explicou ali acima, o . serve para pesquisar as classes no diretório corrente.
D
doraimom
A explicação dele foi sobre o -cp. O ponto não foi mencionado, mas eu acho que entendi já. Deve estar usando ele com a mesma função do “./” que é como eu me refiro a pasta atual. Enfim, o resto ainda não está claro pra mim.
As respostas e o erro que recebi aqui se referem a classe, quando até onde eu consegui ver o problema deveria estar no método. Isso que não tá claro. O que eu entendo é que o meu arquivo Exemplo0501.class contenha a classe compilada. Se isso é verdade por que vocês falam que ele não consegue achar a classe? De todas as outras vezes o comando java não teve problema algum em encontrar a classe (exemplos do cap 1 ao 4).
E
entanglement
É uma boa pergunta. Não sei como está sua máquina, pode ser que tenha sido atualizada.
(Você pegou o seu nickname daquele personagem, o Doraemon ( ドラえもん ) ?
D
doraimom
Sim. Me deram esse apelido, porém, como eu nunca tinha visto o desenho comecei a usar DORAIMOM ao invés de DORAEMON. Foi até bom porque se usasse a grafia correta eu não ia conseguir registrar este nick em diversos lugares.
Quanto a questão do erro, se alguém souber me explicar fiquem a vontade
Obrigado de todo jeito.
P.S.: Vocês compilam os programas de que jeito?
Rodrigo_Sasaki
ele mencionou o . sim, ta ali, cara
o -cp indica aonde devem ser pesquisadas as classes, e o . diz que é no diretório corrente.