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.