Transmiterea argumentelor
- Detalii
- Categorie: Programare Java
- Accesări: 4,265
O aplicate Java poate primi oricate argumente de la linia de comanda in momentul lansarii ei. Aceste argumente sunt utile pentru a permite utilizatorului sa specifice diverse optiuni legate de functonarea aplicatiei sau sa furnizeze anumite date initale programului.
Atentie
Programele care folosesc argumente de la linia de comanda nu sunt 100% pure Java, deoarece unele sisteme de operare, cum ar fi Mac OS, nu au in mod normal linie de comandaa.
Argumentele de la linia de comanda sunt introduse la lansarea unei aplicatii, fiind specificate dupa numele aplicatiei si separate prin spatiu. De exemplu, sa presupunem ca aplicatia Sortare ordoneaza lexicografic (alfabetic) liniile unui fisier si primeste ca argument de intrare numele fisierului pe care sa il sorteze. Pentru a ordona fisierul "persoane.txt", aplicatia va fi lansata astfel:
java Sortare persoane.txt
Asadar, formatul general pentru lansarea unei aplicatii care primeste argumente de la linia de comandaa este:
java NumeAplicatie [arg0 argl . . . argn]
In cazul in care sunt mai multe, argumentele trebuie separate prin spatii iar daca unul dintre argumente contine spatii, atunci el trebuie pus intre ghilimele. Evident, o aplicatie poate sa nu primeasca nici un argument sau poate sa ignore argumentele primite de la linia de comanda.
Primirea argumentelor
In momentul lansarii unei aplicatii interpretorul parcurge linia de comanda cu care a fost lansata aplicattia si, in cazul in care exista, transmite programului argumentele specificate sub forma unui vector de siruri. Acesta este primit de aplicatie ca parametru al metodei main. Reamintim ca formatul metodei main din clasa principala este:
public static void main (String args[])
Vectorul args primit ca parametru de metoda main va contine toate argumentele transmise programului de la linia de comandaa.
In cazul apelului java Sortare persoane.txt vectorul args va contine un singur element pe prima sa pozhpe: args[0]="persoane.txt".
Vectoru args este instantiat cu un numar de elemente egal cu numarul argumentelor primite de la linia de comanda. Asadar, pentru a afla numarul de argumente primite de program este suficient sa aflam dimensiunea vectorului args prin intermediul atributului length:
public static void main (String args[]) { int numarArgumente = args.length ; }
In cazul in care aplicatia presupune existenta unor argumente de la linia de comanda, insa acestea nu au fost transmise programului la lansarea sa, vor aparea exceptii (erori) de tipul ArrayIndexOutOfBoundsException. Tratarea acestor exceptii este prezentata in capitolul ”Exceptii”.
Din acest motiv, este necesar sa testam daca programul a primit argumentele de la linia de comanda necesare pentru functionarea sa si, in caz contrar, sa afiseze un mesaj de avertizare sau sa foloseasca niste valori implicite, ca in exemplul de mai jos:
public class Salut { public static void main (String args[]) { if (args.length == 0) { System.out.println("Numar insuficient de argumente!"); System.exit(-1); //termina aplicatia } String nume = args[0]; //exista sigur String prenume; if (args.length >= 1) prenume = args[1]; else prenume = ""; //valoare implicita System.out.println("Salut " + nume + " " + prenume); } }
Spre deosebire de limbajul C, vectorul primit de metoda main nu contine pe prima pozhpe numele aplicatei, intrucat in Java numele aplicatiei este chiar numele clasei principale, adica a clasei in care se gaseste metoda main.
Sa considera in continuare un exemplu simplu in care se doreste afisarea pe ecran a argumentelor primite de la linia de comandaa:
public class Afisare { public static void main (String[] args) { for (int i = 0; i < args.length; i++) System.out.println(args[i]); } }
Un apel de genul java Afisare Hello Java va produce urmatorul rezultat (aplicatia a primit 2 argumente):
Hello
Java
Apelul java Afisare "Hello Java" va produce insa alt rezultat (aplicatia a primit un singur argument):
Hello Java
Argumente numerice
Argumentele de la linia de comanda sunt primite sub forma unui vector de siruri (obiecte de tip String). In cazul in care unele dintre acestea reprezinta valori numerice ele vor trebui convertite din siruri in numere. Acest lucru se realizeaza cu metode de tipulparseTipNumeric aflate in clasa corespun- zatoare tipului in care vrem sa facem conversia: Integer, Float, Double, etc.
Sa consideram, de exemplu, ca aplicafia Power ridica un numar real la o putere intreaga, argumentele fiind trimise de la linia de comanda sub forma:
java Power "1.5" "2" //ridica 1.5 la puterea 2
Conversia celor doua argumente in numere se va face astfel:
public class Power { public static void main(String args[]) { double numar = Double.parseDouble(args[0]); int putere = Integer.parseInt(args[1]); System.out.println("Rezultat=" + Math.pow(numar, putere)); } }
Metodele de tipul parseTipNumeric pot produce exceptii (erori) de tipul NumberFormatException in cazul in care sirul primit ca parametru nu reprezinta un numar de tipul respectiv. Tratarea acestor exceptii este prezentata in capitolul ’’Exceptii”.