Roteiro Linux

Propaganda
Universidade Federal do ABC
Disciplina: Linguagens de Programação (BC-0501)
Assunto: Primeiro programa em Java (compilação e execução)
Primeiro programa em Java (compilação e execução)
Introdução
Este roteiro de aula prática tem o objetivo de auxiliar o aluno a escrever, compilar e executar o
seu primeiro programa na linguagem Java.
Compilar significa traduzir o programa escrito em uma linguagem de programação de alto nível
(ex: Java) em uma linguagem de máquina, que pode ser compreendida e executada pelo
processador (ex: Intel Pentium) do computador em um determinado sistema operacional (aqui
em Linux). No caso de Java, o programa não é compilado para uma plataforma (processador e
sistema operacional) específica, mas para uma linguagem chamada bytecode de uma máquina
virtual (JVM – Java Virtual Machine). A máquina virtual é emulada em software em várias
plataformas diferentes, de modo que um mesmo programa em bytecode pode ser executado em
todas elas. Essa característica se chama “portabilidade”.
O programa será digitado pelo aluno usando um editor de textos comum (ex: gEdit ou Kate) e
compilado manualmente através de linha de comando (terminal). Para os próximos programas
em Java será utilizado um ambiente (aplicação) mais amigável, mas também mais complexo,
chamado de IDE (Integrated Development Environment ou ambiente integrado de
desenvolvimento). Em particular, apresentaremos o Netbeans.
Preparativos iniciais
Esta prática supõe que JDK (Java Standard Edition Development Kit). Caso não esteja, instalemos
1. Abra um terminal
2. Teste o compilador Java, digitando “javac”. Se uma mensagem grande, iniciada por “Usage:
javac <options> <source files>” for impressa, então o compilador foi executado. Senão,
uma mensagem de erro será apresentada.
Exercício a – Digitando o programa
3. Abra o gEdit (clicando em Applications->Accessories->gEdit) ou outro editor simples que
salve o texto e digite o programa abaixo (sem os números de linhas):
1
//Primeiro Programa em Java
2
public class OlaUfabc
3
{
4
public static void main(String args[])
5
{
6
System.out.println("Viva UFABC em Linux");
7
8
}
}
4. Explicação do programa:
• A linha “1” contem um comentário, pois é iniciada com “//” .
• A linha “2” contem a declaração da classe “OlaUfabc”. Por enquanto é suficiente
entender que uma classe precisa das palavras reservadas “public” e “class” e que
“OlaUfabc” é um nome qualquer, mas que como será visto adiante, precisa ser igual ao
nome do arquivo que vai conter a classe.
1
•
•
•
•
•
Na linha “3”, o caractere “{“ (abre chaves) indica que tudo o vem a seguir pertence à
classe OlaUfabc, até o seu encerramento com “}”.
A linha “4” declara o método principal (“main”) dessa classe, que será executado
quando o programa for iniciado. A declaração “public static void main(String
args[])” é necessária exatamente desta forma (com o tempo, cada palavra será
compreendida, mas por enquanto é suficiente saber que isso é necessário). Nem todas
as classes precisam ter um método “main”.
Na linha “5”, o caractere “{“ (abre chaves) indica que tudo o vem a seguir pertence ao
método “main”, até o seu encerramento com “}”.
A linha “6” contem o comando “System.out.println(“Viva UFABC em Linux”);” que
imprime na tela (linha de comando) a mensagem “Viva UFABC em Linux”.
“System.out” é um objeto de saída padrão e “println” um método que imprime um
string (conjunto de caracteres) e passa para a próxima linha. Existem outros métodos
para imprimir na tela como será visto a seguir, além de métodos para imprimir em
janelas gráficas. Repare que não foi usada a crase, como seria necessário em bom
português. No entanto, existem alguns problemas com relação à acentuação,
principalmente quando se lida com programas que executam em linha de comando.
Todos que já acessaram endereços na Internet, sem pontuação e cedilhas já
experimentaram isso.
As linhas “7” e “8” encerram o método “main” e a classe “OlaUfabc”, respectivamente.
5. Salve o programa com o nome “OlaUfabc.java”, sem as aspas em uma pasta de fácil acesso,
como “home/ufabc/Desktop/”. A extensão “.java” é obrigatória em programas Java. O nome
antes da extensão deve obrigatoriamente ser igual ao nome da classe “public”, observando
que existe diferença entre letras maiúsculas e minúsculas. Em inglês, diz-se que Java é “case
sensitive” porque o compilador é sensível a diferenças entre letras maiúsculas (upper case) e
minúsculas (lower case). Um arquivo pode conter várias classes, mas apenas uma delas deve
ser declarada como “public”. Entretanto, é desaconselhado usar essa prática de programação,
ou seja, recomenda-se usar apenas uma classe “public” em cada arquivo “.java”.
Exercício b – Compilando e executando o programa
6. Assumindo que o JDK está devidamente
7. Para compilar o programa, use o compilador “javac” digitando o comando:
jpgois@paranoid-android:Desktop:~/ javac OlaUfabc.java
jpgois@paranoid-android:Desktop:~/
Caso não haja nenhum erro, a tela voltará para o terminal de comando sem mostrar nenhuma
mensagem. Mensagens de erro serão mostradas caso contrário (o que é mais comum , ou
seja, é muito difícil, mesmo para programadores experientes, digitar um programa e não
cometer nenhum tipo de erro de sintaxe).
8. Observe que, se não houver nenhum erro de compilação, um arquivo com o nome
“OlaUfabc.class” é criado, contendo os bytecodes referente a este programa Java.
jpgois@paranoid-android:Desktop:~/ ls
OlaUfabc.class
OlaUfabc.java
9. Para executar o programa, use o comando “java", que carrega a JVM e interpreta os
bytecodes. O comando e o seu resultado esperado são:
jpgois@paranoid-android:Desktop:~/ java OlaUfabc
Viva UFABC em Linux
jpgois@paranoid-android:Desktop:~/
2
Observe que a extensão “.class” não deve ser incluída no nome do arquivo. Caso contrário,
ocorrerá um erro.
Exercício c – Observando e compreendendo mensagens de erro
10. As possibilidades para a ocorrência de erros quando se compila e executa um programa são
muito grandes, e com a experiência se aprende a identificar e corrigir os mais comuns.
Outros, no entanto, não são nada óbvios e freqüentemente consomem uma boa parte do
tempo dos programadores. Alguns exemplos são apresentados a seguir (caso você ainda não
os tenha experimentado).
11. Erros referentes ao nome do arquivo “.java” errado.
jpgois@paranoid-android:Desktop:~/javac OlhaUfabc.java (foi digitado “Olha” em vez
de “Ola”).
error: cannot read: OlhaUfabc.java
1 error
jpgois@paranoid-android:Desktop:~/javac Ola Ufabc.java (“Ola Ufabc” com um espaço
em branco).
javac: invalid flag: Ola
Usage: javac <options> <source files>
...
12. Erros referentes ao arquivo “.class”. Exclua o arquivo “OlaUfabc.class” (pode usar o comando
“rm").
jpgois@paranoid-android:Desktop:~/java OlaUfabc
Exception in thread "main" java.lang.NoClassDefFoundError: OlaUfabc
Essa mensagem estranha (por enquanto) significa que o arquivo OlaUfabc.class não foi
encontrado.
13. Compile novamente o programa, com “javac” e digite o comando:
jpgois@paranoid-android:Desktop:~/java OlaUfabc.class
Exception in thread "main" java.lang.NoClassDefFoundError: OlaUfabc/class
Dessa vez, o erro ocorreu porque foi digitada a extensão “.class” , que deve ser omitida..
14. Erros referentes ao nome do arquivo diferente do nome da classe “public”. Faça uma cópia do
programa “OlaUfabc.java” para algo como “MeuPrograma.java” e tente compilá-lo:
jpgois@paranoid-android:Desktop:~/javac MeuPrograma.java
MeuPrograma.java:3: class OlaUfabc is public, should be declared in a file
OlaUfabc.java
public class OlaUfabc
^
1 error
jpgois@paranoid-android:Desktop:~/
Essa mensagem identifica um erro na linha 3 (“:3:”), porque a classe OlaUfabc é pública e
deve ser declarada em um arquivo chamado OlaUfabc.java. Experimente também alterar o
nome do arquivo “OlaUfabc.java” para letras minúsculas, ou seja, “olaufabc.java”. O
compilador irá fazer a mesma reclamação.
3
15. Erros de sintaxe (escrita) no programa. Retire o caractere “;” (ponto de virgula) do final da
linha “System.out.println(“Viva UFABC em Linux”);”.
jpgois@paranoid-android:Desktop:~/javac OlaUfabc.java
OlaUfabc.java:8: ';' expected
}
^
1 error
Essa mensagem reclama da falta do “;”. Uma pergunta que surge facilmente é: por que ele
diz que o problema é na linha “8”, antes do “}” e não na linha “7”, depois do “)”? A reposta é
que o “;” não precisa necessariamente estar no final da linha e o compilador o procura nas
próximas linhas até encontrar algo que não devia estar lá, no caso o “}”. Experimente incluir
o “;” antes do “}” na linha “8” ou abrir uma linha depois da linha “7” e antes da linha “8” atual
e incluir somente o “;”, para confirmar como isso funciona. No entanto, não é considerada
uma boa prática de programação, porque dificulta a legibilidade e compreensão do programa.
16. Experimente introduzir outros erros de sintaxe, como por exemplo, remover o “}” final ou
alterar uma palavra “public” para “publica”.
Exercício d – Alterando o programa
17. Como já foi mencionado, existem outros métodos para imprimir uma mensagem em uma tela
de linha de comando, além do “println”, que serão explorados agora.
18. Faça uma cópia do programa OlaUfabc.java para OlaUfabc2.java. Lembre-se de alterar o
nome da classe pública também.
19. Usando o método “print”. Substitua a linha:
6
System.out.println("Viva UFABC em Linux ");
por
6
6.1
System.out.print ("Viva UFABC em ");
System.out.println (" Linux ");
Compile o programa. O resultado deve ser igual ao programa anterior, porque o método
“print” imprime a mensagem, mas não passa para a próxima linha
20. Substitua agora o método “print” por “println” e veja o resultado. As mensagens “Viva UFABC
em” e “Linux” devem ser impressas em linhas diferentes agora.
21. Usando o método “printf”, para obter uma saída formatada. O “printf” consegue tratar de
diferentes tipos de dados e não apenas strings (conjuntos de caracteres). Edite o arquivo
chamado MeuPrograma.java criado anteriormente e faça as modificações indicadas a seguir.
22. Pulando de linha com a seqüência de escape “\n”. Use o comando “printf” da seguinte forma:
6
System.out.printf("Viva UFABC em Linux\n ");
O “\n” dentro do “printf” informa que a saída deve passar para a próxima linha. Insira outros
“\n” em outros pontos da mensagem para ver o efeito.
Existem outras seqüências de escape, como “\t”, “\r” e “\\”. Experimente-as. Observe que
essas seqüências funcionam também com “print” e “println”, mas são mais freqüentemente
usadas com “printf” (por conta das origens na linguagem C).
23. Usando a saída formatada. Transforme a linha de impressão anterior em um comentário (com
“//”) e digite esta:
System.out.printf("%s\n%s\n", " Viva UFABC ", " em Linux ");
Agora o método “printf” está sendo invocado (usado) com 3 argumentos, separados por
vírgulas. O primeiro argumento contém o “string de argumento” composto de especificadores
4
de formato (iniciados por “%”) e seqüências de escape. Nesse caso, “%s” significa que vai ser
formatado um string. Repare que existe dois “%s” no string de argumento e outros dois
argumentos após ele. É necessário que haja um casamento entre a quantidade de
especificadores de formato e de argumentos após o string de argumentos. Existem outros
especificadores de formato, como para números inteiros (%d) e reais (%f).
24. Novamente comente a linha de impressão anterior (com “//”) e digite esta:
System.out.printf("%s\n%s%d\n%s%f\n", "Nome: Maria", "Idade: ", 19,
"Altura: ", 1.69);
Repare agora que a seqüência representa a formatação da saída e ficou mais complexa
“%s\n%s%d\n%s%3.2f\n”. Existem cinco especificadores de formato e cinco argumentos após o
string de argumento. Os tipos dos especificadores devem coincidir com os tipos dos
argumentos, ou seja, por exemplo “%s” com “Idade: ”, “%d” com 19 e “%f” com 1.69.
Experimente trocar a idade (19) por um nome, para observar um erro de execução. Porém,
nem sempre ocorrem erros desse tipo para nos avisar, porque Java tenta fazer conversão de
tipos em tempo de execução. Algumas vezes o programa fica com um erro de lógica e pode
imprimir resultados incorretos, inclusive em relatórios importantes (imagine, no balanço de
uma empresa, ou nome seu contra-cheque!).
Para a altura ser impressa apenas com duas casas decimais, substitua “%f” por “%.2f”.
Outra maneira de obter o mesmo efeito, mas misturando as mensagens com o string de
argumento e separando dos verdadeiros valores é:
System.out.printf(“Nome: %s\nIdade: %d\nAltura: %3.2f\n”, “Maria",
19, 1.69);
Exercício para casa
1. Uma prática comum entre programadores é que o seu primeiro programa em uma linguagem
de programação deve dizer olá para o mundo, em inglês “Hello world!”. Escreva um programa
que imprima essa mensagem, lembrando-se de coincidir o nome do arquivo com o nome da
classe. Faça pelo menos três versões desse programa, para usar os métodos
“System.out.print”, “System.out.println” e “System.out.printf”.
2. Escreva um programa que imprime os números de 1 a 10 em uma linha e de 11 a 20 na linha
seguinte. Os números devem ter um espaço de alguns caracteres entre eles e os de baixo
devem estar alinhados com os de cima. Dica: use a seqüência de escape “\t” para que os
números se posicionem em marcas de tabulação pré-definidas.
3. No programa anterior, os números de baixo foram alinhados aos de cima pela esquerda,
quando o comum para números é o alinhamento pela direita. Escreva um programa que faça
o alinhamento pela direita. Dica: Use o especificador de formato “%d” indicando a quantidade
de dígitos que o numero deve ter que você obterá o alinhamento pela direita.
4. Faça um programa que imprima a seguinte operação matemática:
123
+ 8
--131
5
Download