In Kotlin, la gestione delle eccezioni è realizzata tramite la struttura try/catch/finally, ma si distingue dall'approccio Java per l'accento sulle Unchecked Exceptions e una sintassi più concisa. Un'importante differenza è che in Kotlin non ci sono checked exceptions, il che solleva lo sviluppatore dall'onere di dichiarare throws e gestire tali eccezioni.
Java utilizza checked/unchecked exceptions, dove le checked richiedono un'intercettazione esplicita o una dichiarazione. Questo porta spesso a boilerplate e codice scomodo. Kotlin è stato progettato per essere più semplice — tutte le eccezioni sono generalmente unchecked (ereditarie da RuntimeException), semplificando la gestione e rendendo il codice più leggibile.
Gli sviluppatori Java che passano a Kotlin cercano di intercettare e specificare checked exceptions — il codice si compila ma il significato si perde. Inoltre, l'uso di finally senza comprendere i dettagli porta a perdite o codice non funzionante.
Utilizziamo try/catch/finally in Kotlin in modo conciso e pertinente:
fun process(data: String): Int = try { data.toInt() } catch (e: NumberFormatException) { 0 } finally { println("Processing done") }
Caratteristiche chiave:
Cosa succede se un'eccezione viene lanciata nel blocco finally? Come influisce sul valore di ritorno?
Le eccezioni lanciate da finally sovrascrivono sempre altre eccezioni o return dal blocco try/catch, il che può portare alla perdita di informazioni importanti sulla causa del crash.
fun demo(): Int = try { 1 } finally { throw RuntimeException("error in finally") }
Può try/catch essere un'espressione in Kotlin? Qual è la differenza rispetto a Java?
Sì. try/catch/finally in Kotlin sono espressioni, quindi possono restituire un risultato e essere utilizzate in luoghi dove sono permessi i valori.
val value = try { risky() } catch (e: Exception) { fallback() }
In Java sono solo operatori.
È obbligatorio intercettare eccezioni in Kotlin se viene chiamata una funzione Java esterna con throws?
No. Poiché le checked exceptions vengono ignorate dal compilatore Kotlin: non è necessario intercettarle esplicitamente, ma possono comunque essere lanciate durante l'esecuzione.
Inseriscono catch (e: Exception) ovunque, senza differenziare tra errori reali e attesi. Usano finally per restituire un valore, il che porta a comportamenti imprevisti in caso di errori.
Pro:
Contro:
Usano l'intercettazione solo per errori attesi, utilizzano finally solo per la pulizia delle risorse, e usano try/catch come espressioni dove migliora la leggibilità.
Pro:
Contro: