Eccezioni java: throw, throws, try, catch

Androidino

Utente Attivo
16 Gen 2014
30
1
0
ciao a tutti,

del corso di programmazione orientata agli oggetti ho capito tutto finora, tranne qualcosa riguardante le eccezioni, mi spiego meglio...

Abbiamo visto che le classi di eccezioni possono appartenere a o ereditare da Exception o RuntimeException... le prime sono un po' più "pesanti" e richiedono controlli obbligatori, mentre per le seconde basterebbe un if, ma è qui che mi confondo: throw e throws quando e dove vanno messi? E il try catch, quando e dove? nei main solitamente, vero?

Gradirei che qualcuno mi spiegasse per entrambi i tipi di eccezioni come e con che logica vanno sistemati throw, throws, try, catch, quando sono obbligatori, quando consigliati, etc.

Grazie! :)
 

Slyfer

Utente Attivo
4 Dic 2010
65
21
0
Ciao, partiamo con le eccezioni.

Le eccezioni si dividono in due categorie le checked e le unchecked (quelle che ereditano da runtime).

Per le checked è obbligatorio mettere un try catch nel metodo o mettere il throws nella firma del metodo stesso; per le unchecked non devi fare nessun controllo.

Esempi di checked exception sono la IOException e derivate (es FileNotFoundException) mentre per le unchecked sono la NullPointerException o l'ArrayIndexOutOfBoundException.

Questa è la teoria, ora ti faccio un esempio per spiegarti come uso io i try catch etc...

Tipicamente un'applicazione si deve dividere in layer; ora senza stare qua ad approfondire avrai sempre della classi (o metodi se fai tutto in una classe sola;) che contengono la business logic, che io tipicamente chiamo service.

Nei service (anche se sono metodi) devi capire se è opportuno catchare l'eccezione o dichiararla nella firma.

Es se ho un metodo che legge il contenuto di un file:

Codice:
public String readFile(String fileName)
Il codice è del tipo:

Codice:
File f = new File(fileName);
InputStream is = f.getInputStream();
....
return fileContent;
Questo codice lancia una FileNotFoundException quindi ho due scelte:

- aggiungere alla throws list
- gestire l'eccezione e ritornare null o stringa vuota

Caso1

Codice:
public String readFile(String fileName) throws FileNotFoundException/CODE]

Caso2 

[CODE]
try{
File f = new File(fileName);
InputStream is = f.getInputStream();
....
return fileContent;
} catch (FileNotFoundException e) {
return null;
}
In linea generale dipende da che si deve fare, io come regola personale catcho le eccezioni sono se devo aggiungere info o personalizzarle usando eccezioni custom

es
Codice:
public String readFile(String fileName) throws ServiceException
try{
File f = new File(fileName);
InputStream is = f.getInputStream();
....
return fileContent;
} catch (FileNotFoundException e) {
throw new ServiceException(e, "File Not Found");
}