L'interfaccia java.lang.Iterator
ha 3 metodi: hasNext
, next
e remove
. Per implementare un iteratore di sola lettura, è necessario fornire un'implementazione per 2 di questi: hasNext
e next
.Cosa fare delle eccezioni durante l'implementazione di java.lang.Iterator
Il mio problema è che questi metodi non dichiarano eccezioni. Quindi, se il mio codice all'interno del processo di iterazione dichiara eccezioni, devo racchiudere il mio codice di iterazione all'interno di un blocco try/catch.
La mia politica attuale è stata quella di ripensare l'eccezione racchiusa in un RuntimeException
. Ma questo ha problemi perché le eccezioni controllate sono perse e il codice client non è più in grado di catturare esplicitamente tali eccezioni.
Come posso aggirare questa limitazione nella classe Iterator?
Ecco un codice di esempio per la chiarezza:
class MyIterator implements Iterator
{
@Override
public boolean hasNext()
{
try
{
return implementation.testForNext();
}
catch (SomethingBadException e)
{
throw new RuntimeException(e);
}
}
@Override
public boolean next()
{
try
{
return implementation.getNext();
}
catch (SomethingBadException e)
{
throw new RuntimeException(e);
}
}
...
}
Un'altra opzione, se non è possibile controllare il codice client UI: creare un iteratore che registrare le eccezioni da qualche parte accessibile con un getter o qualcosa, o chiamare un interfaccia di callback, o qualcosa di controllare e possibile visualizzare l'errore da nessuna parte. Se ciò ti è utile, puoi creare un "CatcherIterator" che semplicemente racchiude un runtime-exception-thrower-iterator e cattura tutte le eccezioni possibili reindirizzandole alla proprietà o all'interfaccia di callback. – helios