Quindi se parliamo di eccezioni unchecked (tutte le sottoclassi di RuntimeException) è sufficiente utilizzare throw quindi lanciando l'eccezione ma senza preoccuparsi di catturarla tramite il try-catch.

Quello che non mi è chiaro però è se c'è differenza tra lanciare una eccezione e gestirla altrove oppure lanciarla e gestirla nel metodo stesso.
Cioè, se questi due frammenti di codice sono equivalenti:
codice:
public class Esempio
{
...
    public void aggiungi()
    {
        try
        {
                ...    
            throw new EccezioneException();
        }
        catch (EccezioneException exc)
        {
            ...
        }
    }
...
}
codice:
public class Principale
{
    public static void main(String args[])
    {
        Esempio esempio = new Esempio();
        
        try
        {
            esempio.aggiungi();
        }
        catch (EccezioniException exc)
        {
            ...
        }
    }
}



public class Esempio
{
...
    public void aggiungi() throws EccezioneException
    {
        ...    
        throw new EccezioneException();        
    }
...
}