Sunteți pe pagina 1din 7

ROMÂNIA

Universitatea Politehnica din Bucuresti

Facultatea de Antreprenoriat, Ingineria si Managementul


Afacerilor

Programarea Calculatoarelor II - Laboratorul 4

Responsabil: Şl.dr.ing. Bogdan Ţigănoaia, bogdantiganoaia@yahoo.com

Obiectivele laboratorului sunt urmatoarele:

 Definirea notiunii de exceptie

 Lucrul cu exceptii in Java

 Taskuri

Exceptii in Java

Exceptiile sunt evenimente speciale, conditii care apar la rulare si necesita oprirea
programului (ex. impatire la 0). Java permite specificarea unor actiuni speciale care vor fi
executate automat la aparitia unor astfel de situatii.
Daca programatorul nu trateaza o anumita exceptie ea va fi tratata automat de catrea
masina virtuala prin oprirea programului si afisarea unui mesaj de eroare pe consola.
Majoritatea exceptiilor sunt derivate din clasa Exception sau RuntimeException, care au ca si
superclasa clasa Trowable.

1
Pentru o portiune de cod se pot intercepta mai multe exceptii diferite, specificand moduri
detratare diferite.
Pentru a trata exceptiile care apar intr-un bloc de cod, acesta va fi inclus intr-o secventa try
… catch:

try {
// intructiuni de supravegheat
} catch (Exceptie1 e1) {
// tratare eroare e1
System.out.println(“A aparut eroarea Exceptie1");
}
catch (Exceptie2 e2) {
// tratare eroare e2
System.out.println(“A aparut eroarea Exceptie2");
}
finally {
// eliberare resurse – se executa neconditionat
}

Constructiile catch se comporta ca niste metode anonime care primesc ca si parametru


obiectul creat la aparitia exceptiei. La aparitia unei erori, blocurile catch vor fi tratate in
ordinea care apar in cod. Eroarea va fi tratata de cel dintai bloc catch care contine tipul
erorii. O eroare netratata provoaca oprirea functiei si revenirea in metoda apelanta.
Secventa se repeta recursiv pana cand eroarea este tratata sau se paraseste programul (se
paraseste metoda main).
Secventa finally se executa si daca a aparut si daca nu a aparut vreo exceptie.
Generarea unei erori se poate face prin instructiunea trow:

if (eroare)
throw new TipExceptie( );

Pentru a putea genera o eroare, tipul ei trebuie declarat in antetul metodei:

[modificatori] tipReturnat nume_functie(…) throws TipExceptie1, TipExceptie2 … {


...

2
}

Daca se apeleaza o metoda care trateaza un tip de eroare, ea trebuie inclusa intr-un bloc try … catch
sau metoda curenta trebuie sa declare de asemenea acel tip de eroare. In caz contrar se va semnala
o eroare la compilare.
In Java sunt identificate doua tipuri de erori posibile (clase derivate direct din Trowable):
Error (erori grave) si Exception (exceptii care pot fi tratate).

Exceptiile utilizator sunt derivate de obicei din clasa Exception. Execeptiile care trebuie
tratate la functiile de biblioteca sunt prezentate in documentatia Java API.

Tratarea erorilor nu mai este o optiune ci o constrângere!

Etapele ce trebuie parcurse ar putea fi sistematizate astfel:

• ”throw an exception”

• ”exception handler”

• ”catch the exception”

Task 1: Parcurgeti cu atentie urmatorul cod si rulati-l, observand efectul.

public class Exemplu {


public static void main(String args[]) {
int v[] = new int[10];
v [10] = 0; //Exceptie !
System.out.println("Aici nu se mai ajunge..");
}
}

Task 2: Parcurgeti cu atentie urmatoarele secvente de cod si rulati-le, observand efectul.

public static void citesteFisier(String fis) {


FileReader f = null;
// Deschidem fi_ierul
f = new FileReader(fis);
// Citim _i afi_am fi_ierul caracter cu caracter
int c;
3
while ( (c=f.read()) != -1)
System.out.print((char)c);
// Inchidem fi_ierul
f.close();
}

Pot provoca exceptii:


• Constructorul lui FileReader
• read
• close

import java.io.*;

public class Exceptii {

public static void main(String args[]) {

String fis="fisier.txt";

FileReader f = null;

try {

// Deschidem fi_ierul

f = new FileReader(fis);

// Citim si afisam fisierul caracter cu caracter

int c;

while ( (c=f.read()) != -1)

System.out.print((char)c);

catch (FileNotFoundException e) {

//Tratam un tip de excep_ie

System.err.println("Fisierul nu a fost gasit!");

catch (IOException e) {

4
//Tratam alt tip de excep_ie

System.out.println("Eroare la citire!");

e.printStackTrace();

finally {

if (f != null) {

// Închidem fisierul

try {

f.close();

catch (IOException e) {

System.err.println("Fisierul nu poate fi închis!");

e.printStackTrace(); }

} // if

} //finally

”Aruncarea” exceptiilor este a doua metoda de lucru cu exceptiile.

În acest caz se utilizeaza clauza throws în antetul metodelor care pot genera exceptii:

[modific] TipReturnat metoda([argumente])

throws TipExceptie1, TipExceptie2, ...

...

5
Atentie !!!

O metoda care nu trateaza o anumita exceptie trebuie obligatoriu sa o ”arunce”.

Task 3: Parcurgeti cu atentie urmatoarele secvente de cod si rulati-le, observand efectul.

import java.io.*;
public class Exceptii {

public static void citesteFisier(String fis) throws


FileNotFoundException, IOException
{
FileReader f = null;
f = new FileReader(fis);
int c;
while ( (c=f.read()) != -1)
System.out.print((char)c);
f.close();
}

public static void main(String args[]) {


if (args.length > 0) {
try {
citesteFisier(args[0]);
}
catch (FileNotFoundException e){
System.err.println("Fisierul n-a fost gasit");
}
catch (IOException e) {
System.out.println("Eroare la citire");
}
}
else
System.out.println("Lipseste numele fisierului");
} // main
} // clasa

Instructiunea throw este folosita în cazul aruncarii explicite de exceptii:

Exemplu:
throw new IOException("Exceptie I/O");
Sau:
if (index >= vector.length)
throw new ArrayIndexOutOfBoundsException();

sau:
6
catch(Exception e) {
System.out.println ("A aparut o exceptie!);
throw e;
}

Avantajele tratarii exceptiilor sunt:

1. Separarea codului se poate observa cu usurinta:


citesteFisier {
deschide fisierul;
determina dimensiunea fisierului;
aloca memorie;
citeste fisierul în memorie;
închide fisierul;
}
2. Propagarea erorilor
3. Gruparea erorilor dupa tip.

ArithmeticException
Ιmpartirea la 0 va genera o exceptie doar daca tipul numerelor împartite este aritmetic
întreg.
Ιn cazul tipurilor reale (float si double) nu va fi generata nici o exceptie, ci va fi
furnizat ca rezultat o constanta care poate fi, functie de operatie, Infinity, -Infinity, sau
Nan.

Exemplu :

int a=1 ;
int b=0;
System.out.println(a/b); // Exceptie la executie!
double x=1, y=-1, z=0;
System.out.println(x/z); // Infinity
System.out.println(y/z); // -Infinity
System.out.println(z/z); // NaN

Task 4 : Testati codul de mai sus, observand rezultatele. Precizati cand se genereaza o
exceptie si cand nu.

Bibliografie: http://www.curs.cs.pub.ro, Note de curs Nirvana Popescu,


http://www.opendrum.upt.ro/

S-ar putea să vă placă și