PDA

Visualizza la versione completa : [JAVA] Eccezioni


Realman
21-11-2005, 17:06
Ciao, volevo sapere qual'è la differenza tra questo pezzo di codice


public Object next ()throws NoSuchElementException
{ if (!hasNext()) throw new NoSuchElementException();
return v[posizione++];
}


e questo

public Object next ()
{ if (!hasNext()) throw new NoSuchElementException();
return v[posizione++];



Qualcuno sa aiutarmi? :confused:

Realman
24-11-2005, 18:44
Riformulo la domanda,magari non si è capito il mio dubbio...

in certi metodi, prima del corpo, si dichiara: throws Eccezione, e nel corpo viene lanciata(credo) con throw....

in altri prima del corpo non si dichiara niente ma nel corpo viene lanciata l'eccezione con throw....che differenza c'è?

che differenza c'è fra throws w throw? :dhò: :dhò:

LeleFT
24-11-2005, 18:54
Beh... la differenza fra i due pezzi di codice è che il primo è corretto, mentre il secondo no. :)

A parte questo: la clausola throws serve ad indicare che il metodo in questione può lanciare eccezioni dei tipi specificati. Un metodo che non dichiara di lanciare eccezioni è un metodo che prevede dei meccanismi per cui qualsiasi eccezione viene catturata e elaborata al suo interno.

Un metodo che dichiara di poter lanciare delle eccezioni, invece, serve ad avvertire chi lo utilizza che sarà lui a dovrsi prendere carico di questa eventualità.


Ciao. :ciauz:

Realman
24-11-2005, 19:06
quindi io throws devo metterlo sempre o nell'interfaccia o nella classe che la implementa se poi all'interno del metodo devo usare il throw?

anx721
24-11-2005, 23:26
Originariamente inviato da LeleFT
Beh... la differenza fra i due pezzi di codice è che il primo è corretto, mentre il secondo no. :)

A parte questo: la clausola throws serve ad indicare che il metodo in questione può lanciare eccezioni dei tipi specificati. Un metodo che non dichiara di lanciare eccezioni è un metodo che prevede dei meccanismi per cui qualsiasi eccezione viene catturata e elaborata al suo interno.



In realtà entrambe le forme sono corrette perchè NoSuchElementException estende RuntimeException ed il vincolo "catch or declare" vale slo per le eccezioni che non sono sottoclassi di RuntimeException.


RuntimeException is the superclass of those exceptions that can be thrown during the normal operation of the Java Virtual Machine.

A method is not required to declare in its throws clause any subclasses of RuntimeException that might be thrown during the execution of the method but not caught.

Ad esempio la NullPointerException può scattare ogni volta che invochi un metodo se un oggetto, se il riferimento è nullo, ma sarebbe insensato racchiudere tutte le ivocazioni di metodi dentro un try/catch. Perchè non è necessario catturare esplicitamente le RuntimeException? Perchè spesso rappresentano errori di programmazione evitabili dal programmatore stesso, e non ha senso recuperare la situazione in tale circostanza, se non per mandare un messaggio di log in cui si dice che il programma sta per andare in crash per un bug. Ad esempio un programmatore può sempre far in modo di non invocare metodi su oggetti nulli; cosi come nel tuo esempio può controllare con hasNext se un altro elemento esiste prima di invocare next.

Ci sono alcune RuntimeException che non rappresentano necessariamente errori di programmazione, ad esempio la NumberFormatException che scatta se si cerca di interpretare una stringa come un numero e dovrebbe sempre essere catturata esplicitamente, visto che l'errore può essere causato dall'utente che ha inserito una stringa non valida e non dal programmatore.

In generale è comuqnue buona norma inserire nella segnatura di un metodo anche le eccezioni RuntimeException che possono essere lanciate, anche se non è obbligatorio.

murder eyes
25-11-2005, 00:22
public Object next ()throws NoSuchElementException
{ if (!hasNext()) throw new NoSuchElementException();
return v[posizione++];
}


public Object next ()
{ if (!hasNext()) throw new NoSuchElementException();
return v[posizione++];



Sono entrambi giusti perchè NoSuchElementException della classe Iterator è una eccezione unchecked(estende da RuntimeException) e quindi non ha bisogno di essere elencata nell'header del metodo.
Infatti nel caso tu non la gestisca nel metodo(come fai infatti) essa viene propagata al chiamante che dovrà racchiudere l'istruzione di chiamata in un blocco try-catch oppure propagarla acnh'esso al suo chiamante(se ne ha uno).
Se invece era una eccezione checked(ovvero che non estende da RuntimeException) il compilatore ti avrebbe dato errore.

LeleFT
25-11-2005, 12:49
In effetti non mi sono andato a guardare nello specifico di che eccezione di trattasse... ho solo guardato alla firma dei metodi e a ciò che fanno... :)


Ciao. :ciauz:

Realman
25-11-2005, 13:51
Grazie a tutti...ora mi è un pò + chiaro! :ciauz:

Loading