Sei sulla pagina 1di 96

Universitatea Constantin Brncui din Trgu-Jiu

Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu

Aplicaii JAVA
Lect.dr. Adrian Runceanu

copyright@www.adrian.runceanu.ro

Curs 10
Excepii n Java
Programare n reea

27.05.2015

Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

1. Excepii n Java
1.
2.
3.
4.
5.
6.
7.

Ce sunt excepiile?
Avantajele excepiilor
"Prinderea" i tratarea excepiilor
"Aruncarea" excepiilor
Ierarhia claselor ce descriu excepii
Excepii la execuie
Crearea propriilor excepii

27.05.2015

Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

Ce sunt excepiile?
Termenul exceptie este o prescurtare pentru "eveniment
exceptional" si poate fi definit astfel:
O exceptie este un eveniment ce se produce n timpul
executiei unui program si care provoaca ntreruperea
cursului normal al executiei.

27.05.2015

Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

Excepii
Exceptiile pot aparea din diverse cauze si pot avea nivele
diferite de gravitate: de la erori fatale cauzate
de echipamentul hardware pn la erori ce tin strict de
codul programului, cum ar fi accesarea unui element din
afara spatiului alocat unui vector.
In momentul cnd o asemenea eroare se produce n timpul
executiei sistemul genereaza automat un obiect de tip
exceptie ce contine:
informatii despre exceptia respectiva
starea programului n momentul producerii acelei
excepii
27.05.2015

Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

Excepii
public class Exceptii {
public static void main(String argsst) {
int v[] = new int[10];
v[10] = 0; // exceptie, vectorul are elementele v[0]...v[9]
System.out.println("Aici nu se mai ajunge...");
}

}
La rularea programului va fi generata o exceptie si se va afisa
mesajul:
Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException :10
at Exceptii.main (Exceptii.java:4)
27.05.2015

Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

Excepii
Crearea unui obiect de tip exceptie se numeste
aruncarea unei exceptii ("throwing an exception").
In momentul n care o metoda genereaza o exceptie
(arunca o excepie) sistemul de executie este
responsabil cu gasirea unei secvente de cod dintr-o
metoda care sa trateze acea exceptie.
Cautarea se face recursiv, ncepnd cu metoda care a
generat exceptia si mergnd napoi pe linia apelurilor
catre acea metoda.
27.05.2015

Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

Excepii
Secventa de cod dintr-o metoda care trateaza o anumita
exceptie se numeste analizor de exceptie ("exception
handler") iar interceptarea si tratarea exceptie se
numeste prinderea exceptiei ("catch the exception").
Cu alte cuvinte la aparitia unei erori este "aruncata" o
exceptie iar cineva trebuie sa o "prinda" pentru a o trata.
Daca sistemul nu gaseste nici un analizor pentru o
anumita exceptie atunci programul Java se opreste cu un
mesaj de eroare (n cazul exemplului de mai sus mesajul
"Aici nu se mai ajunge..." nu va fi tiparit).
27.05.2015

Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

1. Excepii n Java
1.
2.
3.
4.
5.
6.
7.

Ce sunt excepiile ?
Avantajele excepiilor
"Prinderea" i tratarea excepiilor
"Aruncarea" excepiilor
Ierarhia claselor ce descriu excepii
Excepii la execuie
Crearea propriilor excepii

27.05.2015

Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
Prin modalitatea sa de tratare a excepiilor Java are
urmatoarele avantaje fa de mecanismul tradiional
de tratare a erorilor:
1. Separarea codului pentru tratarea unei erori de codul
n care ea poate s apar
2. Propagarea unei erori pn la un analizor de exceptii
corespunztor
3. Gruparea erorilor dup tipul lor

27.05.2015

Curs - Aplicatii Java

10

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
1. Separarea codului pentru tratarea unei erori de codul n care
ea poate s apar
In programarea traditionala tratarea erorilor se combina cu codul
ce poate produce aparitia lor conducnd la aa-numitul "cod
spaghetti".
Sa consideram urmatorul exemplu: o functie care ncarca un
fisier n memorie:
citesteFisier {
deschide fisierul;
determina dimensiunea fisierului;
aloca memorie;
citeste fisierul in memorie;
inchide fisierul;
}

27.05.2015

Curs - Aplicatii Java

11

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
Problemele care pot aparea la aceasta functie, aparent
simpla sunt de genul: "Ce se ntmpla daca: ... ?"
fisierul nu poate fi deschis
nu se poate determina dimensiunea fisierului
nu poate fi alocata suficienta memorie
nu se poate face citirea din fisier
fisierul nu poate fi nchis

27.05.2015

Curs - Aplicatii Java

12

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
Un cod traditional care sa trateze aceste erori ar arata astfel:
int citesteFisier {
int codEroare = 0;
deschide fisier;
if (fisierul s-a deschis) {
determina dimensiunea fisierului;
if (s-a determinat dimensiunea) {
aloca memorie;
if (s-a alocat memorie) {
citeste fisierul in memorie;
if (nu se poate citi din fisier) codEroare = -1;
else codEroare = -2;
}
} else codEroare = -3;
}
27.05.2015

Curs - Aplicatii Java

13

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
inchide fisierul;
if (fisierul nu s-a inchis && codEroare == 0) {
codEroare = -4;
} else codEroare = -4;
} else codEroare = -5;
return codEroare;
} // cod "spaghetti"

Acest stil de progamare este extrem de susceptibil la


erori si ngreuneaz extrem de mult nelegerea sa.

27.05.2015

Curs - Aplicatii Java

14

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
In Java, folosind mecansimul exceptiilor, codul ar arata astfel:
int citesteFisier {
try {
deschide fisierul;
determina dimensiunea fisierului;
aloca memorie;
citeste fisierul in memorie;
inchide fisierul;
}
catch (fisierul nu s-a deschis) { trateaza eroarea; }
catch (nu s-a determinat dimensiunea) { trateaza eroarea; }
catch (nu s-a alocat memorie) { trateaza eroarea; }
catch (nu se poate citi din fisier) { trateaza eroarea; }
catch (nu se poate inchide fisierul) { trateaza eroarea; }
}27.05.2015
15
Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
2. Propagarea unei erori pn la un analizor de excepii
corespunztor

Sa presupunem ca apelul la metoda citesteFisier este consecinta


unor apeluri imbricate de metode:
int metoda2 {
apel metoda3;
int metoda1 {
...
apel metoda2;
}
...
int metoda3 {
}
apel citesteFisier;
...
}
27.05.2015

Curs - Aplicatii Java

16

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
Sa presupunem de asemenea ca dorim sa facem tratarea erorilor doar n
metoda1.
Traditional, acest lucru ar trebui facut prin propagarea erorii ntoarse de
metoda citesteFisier pna la metoda1. int metoda2 {
int codEroare = apel metoda3;
int metoda1 {
if (codEroare != 0)
int codEroare = apel metoda2;
return codEroare;
if (codEroare != 0)
...
proceseazaEroare;
}
...
int metoda3 {
}
int codEroare = apel citesteFisier;
if (codEroare != 0)
return codEroare;
...
}
27.05.2015

Curs - Aplicatii Java

17

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
Java permite unei metode sa arunce exceptiile aparute n cadrul
ei la un nivel superior, adica functiilor care o apeleaza sau
sistemului.
Cu alte cuvinte o metoda poate sa nu si asume responsabilitatea
tratarii exceptiilor aparute n cadrul ei:
metoda1 {
try {
apel metoda2;
}
catch (exceptie) {
proceseazaEroare;
}
...
}
27.05.2015

metoda2 throws exceptie{


apel metoda3;
...
}
metoda3 throws exceptie{
apel citesteFisier;
...
}
Curs - Aplicatii Java

18

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
3. Gruparea erorilor dup tipul lor

In Java exista clase corespunzatoare tuturor


exceptiilor care pot aparea la executia unui program.
Acestea sunt grupate n functie de similaritatile lor
ntr-o ierarhie de clase.
De exemplu, clasa IOException se ocupa cu exceptiile
ce pot aparea la operatii de intrare/iesire si
diferentiaza la rndul ei alte tipuri de exceptii, cum ar
fi FileNotFoundException, EOFException, etc.
27.05.2015

Curs - Aplicatii Java

19

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
La rndul ei clasa IOException se ncadreaza ntr-o
categorie mai larga de exceptii si anume clasa
Exception.
Radacina acestei ierarhii este clasa Throwable

Interceptarea unei exceptii se poate face fie la nivelul


clasei specifice pentru acea exceptie fie la nivelul uneia
din superclasele sale, n functie de necesitatile
programului:

27.05.2015

Curs - Aplicatii Java

20

copyright@www.adrian.runceanu.ro

Avantajele excepiilor
try {
FileReader f = new FileReader("input.dat");
// acest apel poate genera exceptie de tipul FileNotFoundException
// tratarea ei poate fi facuta in unul din modurile de mai jos
}
catch (FileNotFoundException e) {
// exceptie specifica provocata de absenta fisierului 'input.dat'
} // sau
catch (IOException e) {
// exceptie generica provocata de o operatie de intrare/iesire
} // sau
catch (Exception e) {
// cea mai generica exceptie - NERECOMANDATA!
}
27.05.2015

Curs - Aplicatii Java

21

copyright@www.adrian.runceanu.ro

1. Excepii n Java
1.
2.
3.
4.
5.
6.
7.

Ce sunt excepiile ?
Avantajele excepiilor
"Prinderea" i tratarea excepiilor
"Aruncarea" excepiilor
Ierarhia claselor ce descriu excepii
Excepii la execuie
Crearea propriilor excepii

27.05.2015

Curs - Aplicatii Java

22

copyright@www.adrian.runceanu.ro

3. "Prinderea" i tratarea excepiilor


Tratarea exceptiilor se realizeaza prin intermediul blocurilor de
instructiuni try, catch si finally.
O secventa de cod care trateaza anumite exceptii trebuie sa arate
astfel:
try {
Instructiuni care pot genera o
exceptie
}
catch (TipExceptie1 ) {
Prelucrarea exceptiei de tipul 1
}

27.05.2015

catch (TipExceptie2 ) {
Prelucrarea exceptiei de tipul 2
}
...
finally {
Cod care se executa indiferent
daca apar sau nu exceptii
}

Curs - Aplicatii Java

23

copyright@www.adrian.runceanu.ro

3. "Prinderea" i tratarea excepiilor


Sa consideram urmatorul exemplu : citirea unui fisier si afisarea lui pe ecran.
Fara a folosi tratarea exceptiilor codul programului ar arata astfel:
// ERONAT!
import java.io.*;
public class CitireFisier {
public static void citesteFisier() {
FileInputStream sursa = null; // s este flux de intrare
int octet;
public static void main(String args[]) {
sursa = new FileInputStream("fisier.txt");
citesteFisier();
octet = 0;
}
// citesc fisierul caracter cu caracter
}
while (octet != -1) {
octet = sursa.read();
Acest cod va furniza erori la compilare
System.out.print((char)octet);
deoarece n Java tratarea erorilor este
}
obligatorie.
sursa.close();
}
27.05.2015

Curs - Aplicatii Java

24

copyright@www.adrian.runceanu.ro

3. "Prinderea" i tratarea excepiilor


Folosind mecanismul exceptiilor metoda citesteFisier si poate trata singura
erorile pe care le poate provoca:
// CORECT
import java.io.*;
public class CitireFisier {
public static void citesteFisier() {
FileInputStream sursa = null; // s este flux de intrare
int octet;
try {
sursa = new FileInputStream("fisier.txt");
octet = 0;
// citesc fisierul caracter cu caracter
while (octet != -1) {
octet = sursa.read();
System.out.print((char)octet);
}
27.05.2015

Curs - Aplicatii Java

25

copyright@www.adrian.runceanu.ro

3. "Prinderea" i tratarea excepiilor


catch (FileNotFoundException e) {
System.out.println("Fisierul nu a fost gasit !");
System.out.println("Exceptie: " + e.getMessage());
System.exit(1);
}
catch (IOException e) {
System.out.println("Eroare de intrare/iesire");
System.out.println("Exceptie: " + e.getMessage());
System.exit(2);
}
finally {
if (sursa != null) {
System.out.println("Inchidem fisierul...");
try {
sursa.close();
}

27.05.2015

Curs - Aplicatii Java

26

copyright@www.adrian.runceanu.ro

3. "Prinderea" i tratarea excepiilor


catch (IOException e) {
System.out.println("Fisierul poate fi inchis!");
System.out.println("Exceptie: " + e.getMessage());
System.exit(3);
}

}
}

}
public static void main(String args[]) {
citesteFisier();
}
}
27.05.2015

Curs - Aplicatii Java

27

copyright@www.adrian.runceanu.ro

3. "Prinderea" i tratarea excepiilor


Blocul "try" contine instructiunile de deschidere a
unui fisier si de citire dintr-un fisier, ambele putnd
produce exceptii.
Exceptiile provocate de aceste instructiuni sunt
tratate n cele doua blocuri "catch", cte unul pentru
fiecare tip de exceptie.

Inchiderea fisierului se face n blocul "finally",


deoarece acesta este sigur ca se va executa.
27.05.2015

Curs - Aplicatii Java

28

copyright@www.adrian.runceanu.ro

3. "Prinderea" i tratarea excepiilor


Fara a folosi blocul "finally" nchiderea fisierului ar fi trebuit facuta n fiecare
situatie n care fisierul ar fi fost deschis, ceea ce ar fi dus la scrierea de cod
redundant:

try {
...
sursa.close();
}
...
catch (IOException e) {
...
sursa.close(); //cod redundant
}

Nota:
Obligatoriu un bloc de instructiuni "try" trebuie sa fie urmat de unul sau
mai multe blocuri "catch", n functie de exceptiile provocate de acele instructiuni
sau (optional) de un bloc "finally"
27.05.2015

Curs - Aplicatii Java

29

copyright@www.adrian.runceanu.ro

1. Excepii n Java
1.
2.
3.
4.
5.
6.
7.

Ce sunt excepiile ?
Avantajele excepiilor
"Prinderea" i tratarea excepiilor
"Aruncarea" excepiilor
Ierarhia claselor ce descriu excepii
Excepii la execuie
Crearea propriilor excepii

27.05.2015

Curs - Aplicatii Java

30

copyright@www.adrian.runceanu.ro

4. "Aruncarea" excepiilor
In cazul n care o metoda nu si asuma responsabilitatea
tratarii uneia sau mai multor exceptii pe care le pot
provoca anumite instructiuni din codul sau atunci ea
poate sa "arunce" aceste exceptii catre metodele care o
apeleaza, urmnd ca acestea sa implementeze tratarea
lor sau, la rndul lor, sa "arunce" mai departe exceptiile
respective.
Acest lucru se realizeaza prin specificarea n declaratia
metodei a clauzei throws:
metoda throws TipExceptie1, TipExceptie2, ... {
...
} 27.05.2015
31
Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

4. "Aruncarea" excepiilor
O metoda care nu trateaza o anumita exceptie trebuie obligatoriu sa o "arunce".
In exemplul de mai sus daca nu facem tratarea exceptiilor n cadrul metodei citesteFisier
atunci metoda apelanta (main) va trebui sa faca acest lucru:
import java.io.*;
public class CitireFisier {
public static void citesteFisier() throws FileNotFoundException, IOException
{
FileInputStream sursa = null; // s este flux de intrare
int octet;
sursa = new FileInputStream("fisier.txt");
octet = 0;
// citesc fisierul caracter cu caracter
while (octet != -1) {
octet = sursa.read();
System.out.print((char)octet);
}
sursa.close();
}27.05.2015
32
Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

4. "Aruncarea" excepiilor
public static void main(String args[]) {
try {
citesteFisier();
}
catch (FileNotFoundException e) {
System.out.println("Fisierul nu a fost gasit !");
System.out.println("Exceptie: " + e.getMessage());
System.exit(1);
}
catch (IOException e) {
System.out.println("Eroare de intrare/iesire");
System.out.println("Exceptie: " + e.getMessage());
System.exit(2);
}
}
}
27.05.2015

Curs - Aplicatii Java

33

copyright@www.adrian.runceanu.ro

4. "Aruncarea" excepiilor
Se observa ca, n acest caz, nu mai putem diferentia exceptiile provocate de
citirea din fisier si de nchiderea fisierului ambele fiind de tipul IOException.
Aruncarea unei exceptii se poate face si implicit prin instructiunea throw ce
are formatul: throw obiect_de_tip_Exceptie.
Exemple:
throw new IOException();
if (index >= vector.length)
throw new ArrayIndexOutOfBoundsException();
catch(Exception e) {
System.out.println("A aparut o exceptie);
throw e;
}
Aceasta instructune este folosita mai ales la aruncarea exceptiilor proprii
care, evident, nu sunt detectate de catre mediul de executie.
27.05.2015

Curs - Aplicatii Java

34

copyright@www.adrian.runceanu.ro

1. Excepii n Java
1.
2.
3.
4.
5.
6.
7.

Ce sunt excepiile ?
Avantajele excepiilor
"Prinderea" i tratarea excepiilor
"Aruncarea" excepiilor
Ierarhia claselor ce descriu excepii
Excepii la execuie
Crearea propriilor excepii

27.05.2015

Curs - Aplicatii Java

35

copyright@www.adrian.runceanu.ro

5. Ierarhia claselor ce descriu excepii


Radacina claselor ce descriu exceptii este clasa
Thowable iar cele mai importante subclase ale sale sunt
Error, Exception si RuntimeException, care sunt la rndul
lor superclase pentru o serie ntreaga de tipuri de
exceptii.

27.05.2015

Curs - Aplicatii Java

36

copyright@www.adrian.runceanu.ro

5. Ierarhia claselor ce descriu excepii


Clasa Error

Erorile (obiecte de tip Error) sunt cazuri speciale de


exceptii generate de functionarea anormala a
echipamentului hard pe care ruleaza un program
Java si sunt invizibile programatorilor.
Un program Java nu trebuie sa trateze aparitia
acestor erori si este improbabil ca o metoda Java sa
provoace asemenea erori.
27.05.2015

Curs - Aplicatii Java

37

copyright@www.adrian.runceanu.ro

5. Ierarhia claselor ce descriu excepii


Clasa Exception

Obiectele de acest tip sunt exceptiile standard care


trebuie tratate de catre programele Java.
In Java, tratarea exceptiilor nu este o optiune ci o
constrngere.
Exceptiile care pot "scapa" netratate sunt ncadrate
n subclasa RuntimeException si se numesc exceptii
la executie.
27.05.2015

Curs - Aplicatii Java

38

copyright@www.adrian.runceanu.ro

5. Ierarhia claselor ce descriu excepii


In general metodele care pot fi apelate pentru un obiect
exceptie sunt definite n clasa Throwable si sunt publice,
astfel nct pot fi apelate pentru orice tip de exceptie.
Cele mai uzuale sunt:
String getMessage( ) - tipareste detaliul unei exceptii
void printStackTrace( ) - tipareste informatii despre
localizarea exceptiei
String toString( ) - metoda din clasa Object, care
returneaza reprezentarea ca sir de caractere a exceptiei
27.05.2015

Curs - Aplicatii Java

39

copyright@www.adrian.runceanu.ro

1. Excepii n Java
1.
2.
3.
4.
5.
6.
7.

Ce sunt excepiile ?
Avantajele excepiilor
"Prinderea" i tratarea excepiilor
"Aruncarea" excepiilor
Ierarhia claselor ce descriu excepii
Excepii la execuie
Crearea propriilor excepii

27.05.2015

Curs - Aplicatii Java

40

copyright@www.adrian.runceanu.ro

6. Excepii la execuie
In general tratarea exceptiilor este obligatorie n Java.

De la acest principu se sustrag nsa asa numitele


exceptii la executie sau, cu alte cuvinte, exceptiile care
pot proveni strict din vina programatorului si nu
generate de o cauza externa.

27.05.2015

Curs - Aplicatii Java

41

copyright@www.adrian.runceanu.ro

6. Excepii la execuie
Aceste exceptii au o superclasa comuna si anume
RuntimeException si n aceasta categorie sunt incluse:
1. operatii aritmetice (mpartire la zero)

2. accesarea membrilor unui obiect ce are valoarea null


3. operatii cu elementele unui vector (accesare unui
index din afara domeniului, etc)

27.05.2015

Curs - Aplicatii Java

42

copyright@www.adrian.runceanu.ro

6. Excepii la execuie
Aceste exceptii pot aparea oriunde n program si pot fi extrem de
numeroare iar ncercarea de "prindere" a lor ar fi extrem de
anevoioasa.
Din acest motiv compilatorul permite ca aceste exceptii sa ramna
netratate, tratarea lor nefiind nsa ilegala.

int v[] = new int[10];


try {
v[10] = 0;
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Atentie la indecsi!");
e.printStackTrace();
} // legal
27.05.2015

Curs - Aplicatii Java

43

copyright@www.adrian.runceanu.ro

1. Excepii n Java
1.
2.
3.
4.
5.
6.
7.

Ce sunt excepiile ?
Avantajele excepiilor
"Prinderea" i tratarea excepiilor
"Aruncarea" excepiilor
Ierarhia claselor ce descriu excepii
Excepii la execuie
Crearea propriilor excepii

27.05.2015

Curs - Aplicatii Java

44

copyright@www.adrian.runceanu.ro

7. Crearea propriilor excepii


Adeseori poate aparea necesitatea crearii unor exceptii
proprii pentru a pune n evidenta cazuri speciale de erori
provocate de clasele unei librarii, cazuri care nu
au fost prevazute n ierarhia exceptiilor standard Java.

O exceptie proprie trebuie sa se ncadreze n ierarhia


exceptiilor Java, cu alte cuvinte clasa care o
implementeaza trebuie sa fie subclasa a unei clase deja
existente n aceasta ierarhie, preferabil una apropiata ca
semnificatie sau superclasa Exception.
27.05.2015

Curs - Aplicatii Java

45

copyright@www.adrian.runceanu.ro

7. Crearea propriilor excepii


class MyException extends Exception {
public MyException() {}
public MyException(String msg) {
super(msg);
// apeleaza constructorul superclasei Exception

}
}

27.05.2015

Curs - Aplicatii Java

46

copyright@www.adrian.runceanu.ro

7. Crearea propriilor excepii


Un exemplu de folosire a exceptiei nou create:

public class TestMyException {


public static void f() throws MyException {
System.out.println("Exceptie in f()");
throw new MyException();
}
public static void g() throws MyException {
System.out.println("Exceptie in g()");
throw new MyException("aruncata din g()");
}
27.05.2015

Curs - Aplicatii Java

47

copyright@www.adrian.runceanu.ro

7. Crearea propriilor excepii


public static void main(String[] args) {
try {
f();
} catch(MyException e) {e.printStackTrace();}
try {
g();
} catch(MyException e) {e.printStackTrace();}
}
}

27.05.2015

Curs - Aplicatii Java

48

copyright@www.adrian.runceanu.ro

7. Crearea propriilor excepii


Fraza cheie este extends Exception care specifica
faptul ca noua clasa MyException este subclasa a
clasei Exception si deci implementeaza obiecte ce
reprezinta exceptii.

In general codul adaugat claselor pentru exceptii


proprii este nesemnificativ: unul sau doi constructori
care afiseaza un mesaj de eroare la iesirea standard.

27.05.2015

Curs - Aplicatii Java

49

copyright@www.adrian.runceanu.ro

7. Crearea propriilor excepii


Rularea programului de mai sus va produce urmatorul
rezultat:
Exceptie in f()
MyException()
at TestMyException.f(TestMyException.java:12)
at TestMyException.main(TestMyException.java:20)
Exceptie in g()
MyException(): aruncata din g
at TestMyException.g(TestMyException.java:16)
at TestMyException.main(TestMyException.java:23)
27.05.2015

Curs - Aplicatii Java

50

copyright@www.adrian.runceanu.ro

7. Crearea propriilor excepii


Procesul de creare a unei noi exceptii poate fi dus mai
departe prin adaugarea unor noi metode clasei ce
descrie acea exceptie, nsa aceasta dezvoltare nu si
are rostul n majoritatea cazurilor.
In general, exceptiile proprii sunt descrise de clase
foarte simple chiar fara nici un cod n ele, cum ar fi:
class SimpleException extends Exception { }
Aceasta clasa se bazeaza pe constructorul implicit
creat de compilator nsa nu are constructorul
SimpleException(String), care n practica nici nu este
prea des folosit.
27.05.2015

Curs - Aplicatii Java

51

copyright@www.adrian.runceanu.ro

2. Programare n reea
1.
2.
3.
4.
5.
6.

Noiuni generale despre reele


Lucrul cu URL-uri
Socket-uri
Comunicarea prin conexiuni
Comunicarea prin datagrame
Trimiterea de mesaje ctre mai muli clieni

27.05.2015

Curs - Aplicatii Java

52

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Programarea n retea implica trimiterea de mesaje si
date ntre aplicatii ce ruleaza pe calculatoare aflate ntro retea locala sau conectate la Internet.
Pachetul care ofera suport pentru scrierea aplicatiilor de
retea este java.net.
Clasele din acest pachet ofera o modalitate facila de
programare n retea, fara a fi nevoie de cunostinte
prealabile referitoare la comunicarea efectiva ntre
calculatoare.
27.05.2015

Curs - Aplicatii Java

53

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Ce este un protocol ?
Un protocol reprezinta o conventie de reprezentare a
datelor folosita n comunicarea ntre doua calculatoare.
Avnd n vedere faptul ca orice informatie care
trebuie trimisa prin retea trebuie serializata astfel
nct sa poata fi transmisa secvential, octet cu octet,
catre destinatie, era nevoie de stabilirea unor
conventii (protocoale) care sa fie. folosite att de
calculatorul care trimite datele ct si de cel care le
primeste
Cele mai utilizate protocoale sunt TCP si UDP.
27.05.2015

Curs - Aplicatii Java

54

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Definiie

TCP (Transport Control Protocol) este un protocol ce


furnizeaza un flux sigur de date ntre doua calculatoare.
Acest protocol asigura stabilirea unei conexiuni
permanente ntre cele doua calculatoare pe parcursul
comunicatiei.

27.05.2015

Curs - Aplicatii Java

55

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Definiie

UDP (User Datagram Protocol) este un protocol ce


trimite pachete independente de date, numite
datagrame, de la un calculator catre altul fara a garanta
n vreun fel ajungerea acestora la destinatie.
Acest protocol nu stabileste o conexiune permanenta
ntre cele doua calculatoare.

27.05.2015

Curs - Aplicatii Java

56

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Cum este identificat un calculator n retea ?

Orice calculator gazda conectat la Internet este


identificat n mod unic de adresa sa IP (IP este acronimul
de la Internet Protocol).
Aceasta reprezinta un numar reprezentat pe 32 de biti,
uzual sub forma a 4 octeti, cum ar fi de exemplu:
31.14.19.2 si este numit adresa IP numerica.
Corespunzatoare unei adrese numerice exista si o adresa
IP simbolica, cum ar www.utgjiu.ro.
27.05.2015

Curs - Aplicatii Java

57

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


De asemenea fiecare calculator aflat ntr-o retea locala
are un nume unic ce poat fi folosit la identificarea locala
a acestuia.
Clasa Java care reprezinta notiunea de adresa IP este
InetAddress.

27.05.2015

Curs - Aplicatii Java

58

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Ce este un port ?
Un calculator are n general o singura legatura fizica la retea.
Orice informatie destinata unei anumite masini trebuie deci sa
specifice obligatoriu adresa IP a acelei masini.
Insa pe un calculator pot exista concurent mai multe procese
care au stabilite conexiuni n retea, asteptnd diverse informatii.
Prin urmare datele trimise catre o destinatie trebuie sa specifice
pe lnga adresa IP a calculatorului si procesul catre care se
ndreapta informatiile respective.
Identificarea proceselor se realizeaza prin intermediul porturilor.
27.05.2015

Curs - Aplicatii Java

59

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Un port este un numar de 16 biti care identifica n
mod unic procesle care ruleaza pe o anumita masina.
Orice aplicatie care realizeaza o conexiune n retea va
trebui sa ataseze un numar de port acelei conexiuni.
Valorile pe care le poate lua un numar de port sunt
cuprinse ntre 0 si 65535 (deoarece sunt numere
reprezentate pe 16 biti), numerele cuprinse ntre 0 si
1023 fiind nsa rezervate unor servicii sistem si, din
acest motiv, nu trebuie folosite n aplicatii.
27.05.2015

Curs - Aplicatii Java

60

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Clase de baza din java.net
Clase din java.net permit comunicare ntre procese
folosind protocoalele TCP si UDP si sunt prezentate n
tabel:
TCP
UDP
URL
URLConnection

DatagramPacket
DatagramSocket

Socket
ServerSocket

MulticastSocket

Aceste clase permit programarea de retea la nivel de


aplicatie.
27.05.2015

Curs - Aplicatii Java

61

copyright@www.adrian.runceanu.ro

1. Noiuni generale despre reele


Cele 7 nivele ale comunicrii n reea sunt:
Application-level layers

Data communicationlevel layers

27.05.2015

Curs - Aplicatii Java

62

copyright@www.adrian.runceanu.ro

2. Programare n reea
1.
2.
3.
4.
5.
6.

Noiuni generale despre reele


Lucrul cu URL-uri
Socket-uri
Comunicarea prin conexiuni
Comunicarea prin datagrame
Trimiterea de mesaje ctre mai muli clieni

27.05.2015

Curs - Aplicatii Java

63

copyright@www.adrian.runceanu.ro

2. Lucrul cu URL-uri
Definitie

URL este acronimul pentru Uniform Resource Locator si


reprezinta o referinta (adresa) la o resursa aflata pe
Internet.
Aceasta este n general un fisier reprezentnd o pagina
Web sau o imagine, nsa un URL poate face referire si la
interogari la baze de date, la ezultate ale unor comenzi
(programe), etc.
27.05.2015

Curs - Aplicatii Java

64

copyright@www.adrian.runceanu.ro

Lucrul cu URL-uri
Exemple de URL-uri sunt:

http://www.utgjiu.ro/ing
http://www.runceanu.ro/adrian/
http://www.scoaladeinformatica.ro

27.05.2015

Curs - Aplicatii Java

65

copyright@www.adrian.runceanu.ro

Lucrul cu URL-uri
Un URL are doua componente principale:
1. Identificatorul protocolului folosit (http, ftp, etc)
2. Numele resursei referite. Acesta are urmatoarele
componente:
- numele calculatorului gazda (http://www.utgjiu.ro/ing)
- calea completa spre resursa referita
(http://www.utgjiu.ro/ing/orare_20142015/semII/Anul%20IV%20AIA.pdf)
- optional, o referinta de tip anchor n cadrul fisierului referit
(#url)
- optional, portul la care sa se realizeze conexiunea
27.05.2015

Curs - Aplicatii Java

66

copyright@www.adrian.runceanu.ro

Lucrul cu URL-uri
Odata creat, un obiect de tip URL poate fi folosit pentru:

aflarea informatiilor despre resursa referita (numele


calculatorului gazda, numele fisierului, protocolul
folosit. etc)
citirea printr-un flux a continutului fisierului respectiv

conectarea la acel URL pentru citirea si scrierea de


informatii
27.05.2015

Curs - Aplicatii Java

67

copyright@www.adrian.runceanu.ro

Lucrul cu URL-uri
Orice obiect de tip URL poate returna un flux de intrare de
tip InputStream pentru citirea continutului sau. Secventa
clasica pentru aceasta operatiune este:
// Afisarea paginii index.html de la adresa
www.scoaladeinformatica.ro
public class CitireURL {
public static void main(String[] args) throws IOException{
BufferedReader br = null;
27.05.2015

Curs - Aplicatii Java

68

copyright@www.adrian.runceanu.ro

Lucrul cu URL-uri
try {
URL resursa = new URL("http://www.scoaladeinformatica.ro");
InputStream in = resursa.openStream();
br = new BufferedReader(new InputStreamReader(in));
String linie;
while ((linie = br.readLine()) != null) {
// proceseaza linia citita
System.out.println(linie);
}
} catch(MalformedURLException e) {
System.err.println("URL incorect: " + e);
}
finally {
br.close();
}
}
}
27.05.2015

Curs - Aplicatii Java

69

copyright@www.adrian.runceanu.ro

Conectarea la un URL
Se realizeaza prin metoda openConnection ce
realizeaza stabilirea unei conexiuni bidirectionale cu
resursa specificata.
Aceasta conexiune este reprezentata de un obiect de
tip URLConnection ce permite crearea att a unui
flux de intrare pentru citirea informatiilor de la URLul specificat ct si a unui flux de iesire pentru scrierea
de date catre acel URL.

27.05.2015

Curs - Aplicatii Java

70

copyright@www.adrian.runceanu.ro

Conectarea la un URL
Operatiunea de trimitere de date dintr-un program
catre un URL este similara cu trimiterea de date
dintr-un FORM aflat ntr-o pagina HTML.
Metoda folosita pentru trimitere este POST.
In cazul trimiterii de date, obiectul URL este de fapt
un program (comanda) ce ruleaza pe serverul Web
referit prin URL-ul respectiv (servlet, cgi-bin, php,
etc).
27.05.2015

Curs - Aplicatii Java

71

copyright@www.adrian.runceanu.ro

2. Programare n reea
1.
2.
3.
4.
5.
6.

Noiuni generale despre reele


Lucrul cu URL-uri
Socket-uri
Comunicarea prin conexiuni
Comunicarea prin datagrame
Trimiterea de mesaje ctre mai muli clieni

27.05.2015

Curs - Aplicatii Java

72

copyright@www.adrian.runceanu.ro

Socket-uri
Definitie

Un socket (soclu) este o abstractiune software folosita


pentru a reprezenta fiecare din cele doua "capete" ale
unei conexiuni ntre doua procese ce ruleaza ntr-o
retea.
Fiecare socket este atasat unui port astfel nct sa poata
identifica unic programul caruia i sunt destinate datele.

27.05.2015

Curs - Aplicatii Java

73

copyright@www.adrian.runceanu.ro

Socket-uri
Socket-urile sunt de doua tipuri:
1. TCP, implementate de clasele Socket si ServerSocket
2. UDP, implementate de clasa DatagramSocket
O aplicatie de retea ce foloseste socket-uri se
ncadreaza n modelul client/server de concepere a
unei aplicatii.
In acest model aplicatia este formata din doua
categorii distincte de programe numite servere,
respectiv clienti.
27.05.2015

Curs - Aplicatii Java

74

copyright@www.adrian.runceanu.ro

Socket-uri
Programele de tip server sunt cele care ofera diverse
servicii eventualilor clienti, fiind n stare de asteptare
atta vreme ct nici un client nu le solicita serviciile.
Programele de tip client sunt cele care initiaza
conversatia cu un server, solicitnd un anumit
serviciu.
Uzual, un server trebuie sa fie capabil sa trateze mai
multi clienti simultan si, din acest motiv, fiecare
cerere adresata serverului va fi tratata ntr-un fir de
executie separat.
27.05.2015

Curs - Aplicatii Java

75

copyright@www.adrian.runceanu.ro

2. Programare n reea
1.
2.
3.
4.
5.
6.

Noiuni generale despre reele


Lucrul cu URL-uri
Socket-uri
Comunicarea prin conexiuni
Comunicarea prin datagrame
Trimiterea de mesaje ctre mai muli clieni

27.05.2015

Curs - Aplicatii Java

76

copyright@www.adrian.runceanu.ro

Comunicarea prin conexiuni


In acest model se stabileste o conexiune TCP ntre un
program client si un server care furnizeaza un anumit
serviciu.
Structura generala a unui server bazat pe conexiuni
while (true) {
accept a connection;
create a thread to deal with the client;
end while
27.05.2015

Curs - Aplicatii Java

77

copyright@www.adrian.runceanu.ro

Structura generala a unui server bazat pe


conexiuni
import java.net.*;
import java.io.*;
public class SimpleServer extends Thread {
// Definesc portul pe care se gaseste serverul in afara intervalului
1-1024:

public static final int PORT = 8100;


private static ServerSocket serverSocket = null;
private Socket clientSocket = null;

27.05.2015

Curs - Aplicatii Java

78

copyright@www.adrian.runceanu.ro

Structura generala a unui server bazat pe


conexiuni
public void run() {
// Executa solicitarea clientului
String cerere, raspuns;
try {
// in este fluxul de intrare de la client
BufferedReader in = new BufferedReader(new
InputStreamReader(
clientSocket.getInputStream() ));
// out este flux de iesire catre client
PrintWriter out = new PrintWriter(
clientSocket.getOutputStream() );
27.05.2015

Curs - Aplicatii Java

79

copyright@www.adrian.runceanu.ro

Structura generala a unui server bazat pe


conexiuni
// primesc cerere de la client
cerere = in.readLine();
// trimit raspuns clientului
raspuns = "hello " + cerere;
out.println(raspuns);
out.flush();
} catch (IOException e) {
System.err.println("Eroare de citire/scriere \n" + e);
} finally {
// Inchid socketul deschis pentru clientul curent
try {
clientSocket.close();
} catch (IOException e) {
System.err.println("Socketul nu poate fi inchis \n" + e);
}
}
}27.05.2015

Curs - Aplicatii Java

80

copyright@www.adrian.runceanu.ro

Structura generala a unui server bazat pe


conexiuni
public SimpleServer() throws IOException {
serverSocket = new ServerSocket(PORT);
try {
// Asteapta un client
clientSocket = serverSocket.accept();
// Executa solicitarea clientului intr-un fir de executie
new Thread(this).start();
} finally {
serverSocket.close();
}
}
public static void main(String[] args) throws IOException {
SimpleServer server = new SimpleServer();
}
}
27.05.2015

Curs - Aplicatii Java

81

copyright@www.adrian.runceanu.ro

Structura generala a unui client bazat pe


conexiuni
import java.net.*;
import java.io.*;
public class SimpleClient {
public static void main(String[] args) throws IOException {
// adresa IP a serverului

String serverAddress = "127.0.0.1";


// portul la care serverul ofera serviciul

int PORT = 8100;


Socket clientSocket = null;

27.05.2015

Curs - Aplicatii Java

82

copyright@www.adrian.runceanu.ro

Structura generala a unui client bazat pe


conexiuni
PrintWriter out = null;
BufferedReader in = null;
String cerere, raspuns;
try {
clientSocket = new
Socket(serverAddress, PORT);
out = new PrintWriter(
clientSocket.getOutputStream(),
true);
in = new BufferedReader(new
InputStreamReader(
clientSocket.getInputStream()));
// se trimite o cerere la server
cerere = "duke";
out.println(cerere);
27.05.2015

// se asteapta raspuns de la server


raspuns = in.readLine();
System.out.println(raspuns);
} catch (UnknownHostException e) {
System.err.println("Serverul nu poate fi
gasit \n" + e);
System.exit(1);
} finally {
if (out != null)
out.close();
if (in != null)
in.close();
if (clientSocket!= null)
clientSocket.close();
}
}
83
Curs - Aplicatii Java
}

copyright@www.adrian.runceanu.ro

2. Programare n reea
1.
2.
3.
4.
5.
6.

Noiuni generale despre reele


Lucrul cu URL-uri
Socket-uri
Comunicarea prin conexiuni
Comunicarea prin datagrame
Trimiterea de mesaje ctre mai muli clieni

27.05.2015

Curs - Aplicatii Java

84

copyright@www.adrian.runceanu.ro

Comunicarea prin datagrame


In acest model clientul trimite un pachet cu cererea
catre server, acesta primeste pachetul si returneaza
raspunsul tot prin intermediul unui pachet.
Un astfel de pachet se numeste datagrama si este
reprezentat printr-un obiect din clasa DatagramPacket.
Primirea si trimiterea datagramelor se realizeaza tot
prin intermediul unui socket, acesta fiind modelat
preintr-un obiect al clasei DatagramSocket.
27.05.2015

Curs - Aplicatii Java

85

copyright@www.adrian.runceanu.ro

Structura generala a unui server bazat pe


datagrame
import java.net.*;
import java.io.*;
public class DatagramServer {
public static final int PORT = 8200;
private DatagramSocket socket = null;
DatagramPacket cerere, raspuns = null;

27.05.2015

Curs - Aplicatii Java

86

copyright@www.adrian.runceanu.ro

Structura generala a unui server bazat pe


datagrame
public DatagramServer() throws IOException {
Socket = new DatagramSocket(PORT);
try
{
while (true) {
// Declara pachetul in care va fi receptionata cererea

byte[] buf = new byte[256];


cerere = new DatagramPacket(buf, buf.length);
// Astepta aparitia unui pachet cu cererea

socket.receive(cerere);
27.05.2015

Curs - Aplicatii Java

87

copyright@www.adrian.runceanu.ro

Structura generala a unui server bazat pe


datagrame
// Afla adresa si portul de la care vine cererea
InetAddress adresa = cerere.getAddress();
int port = cerere.getPort();
// Construieste raspunsul
buf = ("Hello " + new
String(cerere.getData())).getBytes();
// Trimite un pachet cu raspunsul catre client
raspuns = new DatagramPacket(buf, buf.length, adresa,
port);
socket.send(raspuns);
}
} finally {
socket.close();
}
}
public static void main(String[] args) throws IOException {
new DatagramServer();
}
}
27.05.2015

Curs - Aplicatii Java

88

copyright@www.adrian.runceanu.ro

Structura generala a unui client bazat pe


datagrame
import java.net.*;
import java.io.*;
public class DatagramClient {
public static void main(String[] args) throws IOException {
// adresa IP si portul la care ruleaza serverul

InetAddress address = InetAddress.getByName("127.0.0.1");


int port=8200;
DatagramSocket socket = null;
DatagramPacket packet = null;
byte buf[];
27.05.2015

Curs - Aplicatii Java

89

copyright@www.adrian.runceanu.ro

Structura generala a unui client bazat pe


datagrame
try {
// Construieste un socket pentru comunicare
socket = new DatagramSocket();
// Construieste si trimite pachetul cu cerere catre server
buf = "Duke".getBytes();
packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
// Asteapta pachetul cu raspunsul de la server
buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// Afiseaza raspunsul
System.out.println(new String(packet.getData()));
} finally {
socket.close();
}
}
}27.05.2015

Curs - Aplicatii Java

90

copyright@www.adrian.runceanu.ro

2. Programare n reea
1.
2.
3.
4.
5.
6.

Noiuni generale despre reele


Lucrul cu URL-uri
Socket-uri
Comunicarea prin conexiuni
Comunicarea prin datagrame
Trimiterea de mesaje ctre mai muli clieni

27.05.2015

Curs - Aplicatii Java

91

copyright@www.adrian.runceanu.ro

Trimiterea de mesaje catre mai multi clienti


Diverse situatii impun gruparea mai multor clienti astfel
nct un mesaj (pachet) trimis pe adresa grupului sa fie
receptionat de fiecare dintre acestia.
Gruparea mai multor programe n vederea trimiterii
multiple de mesaje se realizeaza prin intermediul unui
socket special, descris de clasa MulticastSocket, extensie a
clasei DatagramSocket.
Un grup de clienti abonati pentru trimitere multipla este
specificat printr-o adresa IP din intervalul 224.0.0.1 239.255.255.255 si un port UDP.
Adresa 224.0.0.0 este rezervata si nu trebuie folosita.
27.05.2015

Curs - Aplicatii Java

92

copyright@www.adrian.runceanu.ro

Trimiterea de mesaje catre mai multi clienti


Inregistrarea unui client ntr-un grup
import java.net.*;
import java.io.*;
public class MulticastClient {
public static void main(String[] args) throws IOException {
// adresa IP si portul care reprezinta grupul de clienti
InetAddress group = InetAddress.getByName("230.0.0.1");
int port=4444;
MulticastSocket socket = null;
byte buf[];
27.05.2015

Curs - Aplicatii Java

93

copyright@www.adrian.runceanu.ro

Trimiterea de mesaje catre mai multi clienti


try {
// Se alatura grupului aflat la adresa si portul specificate
socket = new MulticastSocket(port);
socket.joinGroup(group);
// asteapta un pachet venit pe adresa grupului
buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
System.out.println(new String(packet.getData()));
}
finally {
socket.leaveGroup(group);
socket.close();
}
}
}

27.05.2015

Curs - Aplicatii Java

94

copyright@www.adrian.runceanu.ro

Transmiterea unui mesaj catre un grup


import java.net.*;
import java.io.*;
public class MulticastSend {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("230.0.0.1");
int port = 4444;
byte[] buf;
DatagramPacket packet = null;
// Creeaza un socket cu un numar oarecare
DatagramSocket socket = new DatagramSocket(0);
try
{
// Trimite un pachet catre toti clientii din grup
buf = (new String("Salut grup")).getBytes();
packet = new DatagramPacket(buf, buf.length, group, port);
socket.send(packet);
} finally {
socket.close();
}
27.05.2015
Curs - Aplicatii Java
}

95

copyright@www.adrian.runceanu.ro

ntrebri?

27.05.2015

Curs - Aplicatii Java

96

Potrebbero piacerti anche