Escrevendo um método main ()
Um programa Java inicia a execução com seu método main(). Um método main() é a porta de entrada entre a inicialização de um processo Java, que é gerenciado pelo Java Virtual Machine (JVM) e o início do código do programador. A JVM chama o sistema subjacente para alocar memória e tempo de CPU, arquivos de acesso e assim por diante. O método main() nos permite ligar nosso código a este processo, mantendo-o vivo por tempo suficiente para fazer o trabalho que codificamos. A classe mais simples possível com um método main() parece isto:
1: public class Zoo {
2: public static void main(String[] args) {
3:
4: }
5:}
Este código não faz nada de útil (ou prejudicial). Não tem instruções além de declarar o ponto de entrada. Ilustra, em certo sentido, que o que você pode colocar em um método main() é arbitrário. Qualquer código Java legal serve. Na verdade, a única razão pela qual precisamos de um estrutura de classe para iniciar um programa Java é porque a linguagem exige isso. Para compilar e execute este código, digite-o em um arquivo chamado Zoo.java e execute o seguinte:
$ javac Zoo.java
$ java Zoo
Se você não receber mensagens de erro, você obteve sucesso. Se você receber mensagens de erro, verifique que você instalou um Java Development Kit (JDK) e não um Java Runtime Environment (JRE), que você adicionou ao PATH e que não criou nenhum erro de digitação no exemplo. Se você tiver algum desses problemas e não souber o que fazer, poste uma pergunta com a mensagem de erro que você recebeu no Fórum Java inicial no CodeRanch (www.coderanch.com/fóruns/f-33/java). Para compilar o código Java, o arquivo deve ter a extensão .java. O nome do arquivo deve corresponder ao nome da classe. O resultado é um arquivo de bytecode com o mesmo nome, mas com uma extensão .class. Bytecode consiste em instruções que a JVM sabe como executar. Observe que devemos omitir a extensão .class para executar o Zoo.java porque o ponto (.) tem um significado reservado na JVM.
As regras para o que um arquivo de código Java contém, e em que ordem, são mais detalhadas do que o que explicamos até agora (há mais sobre este tópico mais adiante no capítulo). Para manter as coisas simples por enquanto, vamos seguir um subconjunto das regras:
■ Cada arquivo pode conter apenas uma classe.
■ O nome do arquivo deve corresponder ao nome da classe, incluindo maiúsculas e minúsculas, e ter uma extensão .java.
Suponha que substituímos a linha 3 em Zoo.java por System.out.println ("Welcome!") ;. Quando nós compilamos e executamos o código novamente, nós obteremos a linha de saída que corresponde ao que está entre as citações. Em outras palavras, o programa produzirá Welcome!. Vamos revisar primeiro as palavras na assinatura do método main(), uma de cada vez.
A chave-palavra public é o que chamamos de modificador de acesso. Declara o nível de exposição deste método para possíveis chamadores no programa. Naturalmente, public significa qualquer lugar no programa. Você aprenderá sobre modificadores de acesso no Capítulo 4, "Methods and Encapsulation." A palavra-chave static vincula um método a sua classe para que possa ser chamada apenas pelo nome da classe, como em, por exemplo, Zoo.main(). Java não precisa criar um objeto para chamar o método main() - o que é bom, pois você ainda não aprendeu a criar objetos! Na verdade, a JVM faz isso, mais ou menos, ao carregar o nome da classe dado a ela. Se um método main() não está presente na classe que nomeamos com o executável .java, o processo lançará um erro e terminará. Mesmo que um método main() esteja presente, o Java lançará uma exceção se não for static. Um método main() não static pode também ser invisível do ponto de vista da JVM. Veremos static novamente no Capítulo 4.
A palavra-chave void representa o tipo de retorno. Um método que retorna nenhum retorno de dados controle para o chamador silenciosamente. Em geral, é boa prática usar void para métodos que alteram o estado de um objeto. Nesse sentido, o método main() altera o estado do programa do início ao fim. Vamos explorar os tipos de retorno no Capítulo 4 também. Empolgado com Capítulo 4 ainda?
Por fim, chegamos à lista de parâmetros do método main(), representada como uma matriz do objeto java.lang.String. Na prática, você pode escrever String[] args, String args[] ou String ...args; o compilador aceita qualquer um deles. O nome da variável args sugere que esta lista contém valores que foram lidos em (argumentos) quando a JVM foi iniciada. Você pode usar qualquer nome que quiser. Os caracteres [] são colchetes e representam uma matriz. Uma matriz é uma lista de tamanho fixo de itens que são todos do mesmo tipo. Os caracteres ... são chamados varargs (argumento variável listas). Você aprenderá sobre String no Capítulo 2, “Operadores e declarações”. Arrays e varargs seguirá no Capítulo 3, "APIs Java principais".
Vamos ver como usar o parâmetro args. Primeiro nós modificamos o programa do Zoo para imprimir os dois primeiros argumentos foram passados:
public class Zoo {
public static void main(String[] args) {
System.out.println(args[0]);
System.out.println(args[1]);
}
}
args [0] acessa o primeiro elemento da matriz. É isso mesmo: índices de array começam com 0 em Java. Para executá-lo, digite isto:
$ javac Zoo.java
$ java Zoo Bronx Zoo
A saída que você pode esperar:
Bronx
Zoo
O programa identifica corretamente as duas primeiras “palavras” como argumentos. Espaços são usados para separar os argumentos. Se você quer espaços dentro de um argumento, você precisa usar aspas como neste exemplo:
$ javac Zoo.java
$ java Zoo "San Diego" Zoo
Agora temos um espaço na saída:
San Diego
Zoo
Todos os argumentos da linha de comando são tratados como objetos String, mesmo que eles representam outro tipo de dados:
$ javac Zoo.java
$ java Zoo Zoo 2
Não importa. Você ainda obtém os valores de saída como Strings. No Capítulo 2, você aprenderá como converter sequências de Strings para números.
Zoo
2
Finalmente, o que acontece se você não transmitir argumentos suficientes?
Lendo args[0] vai bem e Zoo é impresso. Então Java entra em pânico. Não há segundo argumento! O que fazer? Java imprime uma exceção dizendo que não tem idéia do que fazer com este argumento na posição 1. (Você aprenderá sobre exceções no Capítulo 6, "Exceptions".)
ZooException in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 1
at mainmethod.Zoo.main(Zoo.java:7)
Para revisar, você precisa ter um JDK para compilar porque ele inclui um compilador. Você não precisa ter um JDK para executar o código - um JRE é suficiente. Os arquivos de classe Java são executados na JVM e portanto, é executado em qualquer máquina com Java, em vez de apenas a máquina ou o sistema operacional que eles foram compilados.