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 é:
[quote]class Exemplo0501
{
public static void main (String args[])
{
imprime(); // invocação do método
}
public static void imprime()
{
System.out.println(“Aprendendo a Linguagem Java”);
}
}[/quote]
Erro: [quote]Não foi possível localizar nem carregar a classe principal Exemplo0501[/quote]
O que eu teria de fazer (o que mudou) para que este simples exemplo funcione?
Obrigado.
O exemplo parece correto.
como você está compilando o arquivo .java? Está usando alguma IDE ?
o .class foi gerado corretamente? com que linha de comando você está tentando executar a classe ?
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
Só confirma se o nome do arquivo é Exemplo0501.java
O nome do arquivo e a declaração “class Exemplo0501” devem ser iguais.
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.
Nome do arquivo: Exemplo0501.java
Nome da classe dentro do arquivo java acima: class Exemplo0501
Comando no terminal para rodar Exemplo0501.class: java Exemplo0501
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.
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.
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.
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.
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
[quote=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
[/quote]
Interessante…
Mas ele conseguiria compilar sem especificar o classpath dessa maneira? caso a variável não esteja especificada?
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
Só para constar:
[quote]CLASSPATH
C:\Program Files\Java\jdk1.7.0_05\lib
JAVA_HOME
C:\Program Files\Java\jdk1.7.0_05;
PATH
C:\Program Files\Java\jdk1.7.0_05\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0[/quote]
experimente alterar sua variável CLASSPATH para
.;%JAVA_HOME%
e tente executar novamente.
[quote=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?
[/quote]
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ê.
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.
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.