Anatomia limbajului Java

Fie urmatorul cod (Count.java)

 1: import java.io.*;
 2: public class Count {
 3:    public static void countChars(Reader in) throws IOException
 4:     {
 5:         int count = 0;
 6:         while (in.read() != -1)
 7:             count++;
 8:         System.out.println("Counted " + count + " chars.");
 9:     }
10:     public static void main(String[] args) throws Exception
11:     {
12:        if (args.length >= 1)
13:             countChars(new FileReader(args[0]));
14:         else
15:             System.err.println("Usage: Count filename"); 
16:     }
17: }

Acest cod trebuie salvat sub numele de Count.java. Sa presupunem ca l-am salvat in folderul:

D:\_work\javaco\count

si ca folderul count este creat in mod special pentru aceasta aplicatie. Dam apoi comanda de compilare obisnuita:

javac Count.java

in urma careia este creat fisierul Count.class in acelasi folder. Pentru a rula acest exemplu in acest folder trebuie ca folderul count sa fie inregistrat in variabila de mediu CLASSPATH. Dam pentru aceasta comanda

set CLASSPATH=D:\_work\javaco\count

Daca uitam sa dam aceasta comanda vom primi un mesaj de genul:

Exception in thread "main" java.lang.NoClassDefFoundError: Count

Abia acum putem lansa comanda de interpretare a fisierului Count.class prin:

java Count

vom primi mesajul:

Usage: Count filename

de data aceasta programul a fost rulat insa el ne precizeaza ca asteapta la linia de consola numele unui fisier caruia sa-i numele caracterele. Lansam acum comanda

java Count Count.java

si primim raspunsul

Counted 502 chars.

Programul a numarat octetii cuprinsi in fisierul Count.java.

Analiza

Sa analizam linie cu linie continutul fisierului Count.java. linia

  1. import java.io.*; face apel la Java API, si anume la toate clasele cuprinse in biblioteca java.io.
  2. public class Count { incepe definitia unei clase publice cu numele Count (Obligatoriu, fisierul ce contine acest cod trebuie sa se numeasca Count.java).
  3. public static void countChars(Reader in) throws IOException
    incepe definitia unei metode de clasa (specificata prin cuvantul static) cu numele countChars ce admite un singur parametru in de tip Reader si care nu intoarce nici o valoare (specificat prin cuvantul cheie void). Aceasta metoda poate genera exceptii de tip intrare/iesire (throws IOException).
  4. { incepe corpul metodei countChars.
  5. int count = 0; Este definita o variabila count, locala metodei countChars, pe care o initializeaza cu valoarea 0, folosind operatorul de atribuire =.
  6. while (in.read() != -1) Se foloseste o instructiune de ciclare de tip while care va fi executata atata vreme cat metoda read() a obiectului in (apelul metodei se face folosind operatorul . intre obiect - in - si numele metodei -read() ) nu returneaza valoarea -1. Valoarea -1 este de regula asociata cu sfarsitul unui fisier EOF (End Of File).
  7. count++; reprezinta corpul instructiunii while. Aici variabila count este incrementata cu 1 folosind operatorul unar postfixat ++.
  8. System.out.println("Counted " + count + " chars.");
    este apelata metoda println pentru streamul out al clasei System. In clasa System sunt definite trei streamuri: System.in, System.out si System.err. Ele corespund fisierelor stdin, stdout si stderr definite in limbajul C de unde sunt imprumutate. Pentru detalii suplimentare trebuie consultata clasa System din biblioteca java.lang. In construiea argumentului metodei println este folosit operatorul + care aici are semnificatia de operator de concatenare.
  9. } Aici se termina corpul metodei countChars.
  10. public static void main(String[] args) throws Exception
    Atunci cand o aplicatie este executata folosind interpretorul Java, este specificat numele clasei ce se doreste a fi rulata. Interpretorul invoca metoda main definita in interiorul acelei clase. Metoda main controleaza desfasurarea programului, aloca toate resursele necesare si executa metodele care asigura functionalitatea aplicatiei. Aceasta metoda poate genera exceptii in timpul rularii (throws Exception). Arrayul args de siruri (String[]) primeste argumentele prezente la linia de consola dupa numele aplicatiei rulate (aici dupa Count).
  11. { incepe corpul metodei main.
  12. if (args.length >= 1) Instructiune de decizie in care args.length este lungimea arrayului args. Toate arrayurile incep cu indexul 0. Elementul args[0] va contine sirul introdus la consola dupa sirul "Count" care este numele aplicatiei rulate (interpretate, mai exact). 
  13. countChars(new FileReader(args[0])); este singura instructiune executata daca conditia args.length >= 1 este adevarata. Aceasta instructiune apeleaza metoda countChars careia ii este transmisa o valoare de tip Reader creata chiar la apelare folosind operatorul new si functia constructor FileReader careia i se transmite ca argument numele fisierului ale carui octeti vor fi numarati.
     Nota. In Windows pentru fiecare terminator de linie se numara doi octeti corepspunzatori codurilor ASCII: CR si LF (0x0d si 0x0a). In UNIX (sau LINUX) pentru ca terminator de linie se foloseste doar caracterul LF, de aceea se vor gasi diferite lungimi ale fisierelor editate in Windows si Linux, chiar daca continutul liniilor este acelasi.
  14. else cuvant cheie care extinde instructiunea if la sintaxa if-else. else permite rularea intructiunii (sau blocului) ce urmeaza.
  15. System.err.println("Usage: Count filename");
    este apelata din nou metoda println avand ca argument sirul:
    "Usage: Count filename", care precizeaza utilizatorului aplicatiei Count ca asteapta un argument cu semnificatia de nume de fisier. 
  16. } Aici se termina corpul metodei main.
  17. } Aici se termina definitia clasei Count.

 

 

 

 

 

Cornel Mironel Niculae, 2003-2007

26-Jun-2007