I metodi che generano RuntimeException dovrebbero indicarlo nella firma del metodo?


86

Ad esempio, molti metodi in framework / JDK potrebbero generare

java.lang.SecurityException 

ma questo non è indicato nella firma del metodo (poiché questa è una pratica normalmente riservata alle eccezioni verificate). Voglio sostenere che la dichiarazione di RuntimeExceptions nel metodo sigs ha molti vantaggi (simile al controllo del tipo statico, ad esempio). Sono ubriaco o altro?

Risposte:


70

Non dichiarerei un'eccezione non controllata nella firma, poiché è fuorviante per l'utente di tale API. Non è più ovvio se l'eccezione debba essere gestita esplicitamente.

Dichiararlo nel javadoc è un approccio migliore poiché consente a qualcuno di gestirlo se lo ritiene necessario, ma sapendo che può ignorarlo se lo desidera. Ciò rende chiara la separazione tra selezionati e non selezionati.


4
Il compilatore java non ti obbliga a gestire le RuntimeExceptions dichiarate. Quindi puoi dichiararli, allo scopo come un "suggerimento" per gli sviluppatori. È discutibile, se JavaDoc è un posto migliore per quello. Il punto sulle eccezioni selezionate e deselezionate è importante. Le eccezioni selezionate e deselezionate sono ciò che Java significa realmente con (Compiletime-) Exceptions (selezionato) e RuntimeExceptions (non selezionato).
Guardian667

6
In primavera la dichiarazione di eccezioni non controllate nella firma del metodo ha iniziato a essere una pratica comune.
johnlemon

39

Dal tutorial Oracle Java :

"Se è così utile documentare l'API di un metodo, comprese le eccezioni che può generare, perché non specificare anche le eccezioni di runtime?" Le eccezioni di runtime rappresentano problemi che sono il risultato di un problema di programmazione e, come tale, non ci si può ragionevolmente aspettare che il codice client API si ripristini da esse o che li gestisca in alcun modo. Tali problemi includono eccezioni aritmetiche, come la divisione per zero; eccezioni del puntatore, come il tentativo di accedere a un oggetto tramite un riferimento nullo; e le eccezioni di indicizzazione, come il tentativo di accedere a un elemento dell'array tramite un indice troppo grande o troppo piccolo.

Le eccezioni di runtime possono verificarsi ovunque in un programma e in un programma tipico possono essere molto numerose. Dover aggiungere eccezioni di runtime in ogni dichiarazione di metodo ridurrebbe la chiarezza di un programma.


Pertanto, il compilatore non richiede di rilevare o specificare eccezioni di runtime (sebbene sia possibile).
johnlemon

18

Dai un'occhiata al javadoc per Collection # add

C'è tutta una serie di eccezioni non controllate menzionate:

Throws:
UnsupportedOperationException - add is not supported by this collection.
ClassCastException - class of the specified element prevents it from being added to this collection.
NullPointerException - if the specified element is null and this collection does not support null elements.
IllegalArgumentException - some aspect of this element prevents it from being added to this collection.

Se hai pazienza, ti consiglio di documentare accuratamente le possibili eccezioni generate dai tuoi metodi in questo modo. In un certo senso, è ancora più importante farlo per le eccezioni non controllate, poiché le eccezioni verificate sono in qualche modo auto-documentate (il compilatore forza il codice chiamante a riconoscerle).


6
Questa risposta è sbagliata. Stai parlando di dichiarazioni Javadoc mentre la domanda throwsnella firma del metodo. Queste non sono la stessa cosa. Sì, è assolutamente necessario documentare tutte le eccezioni generate dal tuo API, ma la questione non è di questo.
Gili

8

Dal mio punto di vista è meglio dichiarare eccezioni di runtime almeno nel javadoc per il metodo. Dichiararlo nella firma rende ancora più ovvio cosa può accadere quando qualcosa va storto. Questo è il motivo principale per cui suggerisco di fornire queste informazioni.

Cordiali saluti: con il passare del tempo (ora nel 2017) mi sto appoggiando molto di più a documentarli solo in javadoc ed evitare il più possibile le eccezioni controllate.


3

A mio avviso, le eccezioni non controllate non dovrebbero mai essere dichiarate nella firma del metodo poiché ciò è contrario alla loro natura.

Se, tuttavia, è probabile che un metodo generi alcune eccezioni non controllate, annotando le probabili circostanze in @throws in Javadoc può essere utile per altri che invocano il metodo per capire cosa può andare storto. Questo è utile solo per le eccezioni che è probabile che i chiamanti siano in grado di gestire (come un NPE dovuto a un input errato, ecc.)


3

Se stai scrivendo un'API per l'utilizzo da parte di altri, allora c'è un'ampia ragione per la documentazione esplicita del tuo intento nell'API e non c'è alcun aspetto negativo nel dichiarare RuntimeExceptions nella firma del metodo.


1

Questo ha a che fare con la discussione sulle eccezioni controllate . La maggior parte sarebbe d'accordo sul fatto che le eccezioni non dovrebbero essere dichiarate nelle firme dei metodi.

C'è anche una discussione su come dovrebbero essere usate le eccezioni di runtime. Sono d'accordo con un poster che le eccezioni di runtime dovrebbero denotare un errore di programmazione o una condizione fatale. Quindi non c'è molto merito nel dichiararli nella firma. Ogni metodo potrebbe potenzialmente tramite uno.


Dove si adatta allora un'eccezione di analisi o qualche altra eccezione del tipo di convalida dei dati. Stai insinuando che non dovresti usare le eccezioni controllate, ma poi stai limitando per cosa le eccezioni non spuntate dovrebbero essere usate.
Robin

1
Quello che sto dicendo è che lo sviluppatore non dovrebbe essere costretto a rilevare le eccezioni controllate. Quindi non è necessario dichiararli nella firma del metodo. In Java, puoi trasformarli in eccezioni di runtime, come sta facendo Spring. Sto anche dicendo che le eccezioni di runtime dovrebbero essere lanciate solo in situazioni non recuperabili.
kgiannakakis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.