2010-05-07 12 views
12

La specifica delle eccezioni fa parte della firma del metodo? Quello che voglio dire è:Specifica delle eccezioni

public void someMethod(String myString) throws IOException 

è 'throws IOException' una parte di una firma di questo metodo?

Grazie

risposta

6

Facendo seguito a Jon Skeet's answer e in risposta al commento

@ Jon Skeet Perché allora non posso ho public void run() throws IOException in una classe che implementa Runnable? - Conoscendomi conoscendoti

Sezione 8.4.6 del Java Language Specification (3a ed) dice:

Un metodo che la priorità o nasconde un altro metodo (sezione 8.4.8), compresi i metodi che implementano abstract metodi definiti nelle interfacce, non possono essere dichiarati a gettare più controllate le eccezioni rispetto al metodo sovrascritto o nascosto.

Più precisamente, supponiamo che B è una classe o interfaccia, e Un è una superclasse o superinterfaccia di B, e una dichiarazione di metodo n in B sostituzioni o nasconde una dichiarazione di metodo m in A. Se n ha una clausola throws che cita tutti i tipi eccezione controllata, poi m deve avere una clausola throws, e per ogni controllato tipo di eccezione elencata nella clausola throws di n, quella stessa classe di eccezione o una delle sue supertipi deve avvenire nella cancellazione della clausola throws di m; in caso contrario, si verifica un errore in fase di compilazione.

Non è una questione di firma del metodo qui, ma una questione di non richiedere ai chiamanti di tenere conto delle eccezioni che non devono essere controllate dal metodo "originale" che stanno chiamando.

5

No. Da section 8.4.2 of the Java Language Spec:

Due metodi hanno la stessa firma se hanno lo stesso nome e l'argomento tipi. Metodo o costruttore

due dichiarazioni M e N hanno gli stessi tipi di argomenti se tutte le seguenti condizioni attesa:

Essi hanno lo stesso numero di parametri formali (eventualmente zero) hanno stesso numero di parametri di tipo (eventualmente nullo) sia sia i parametri di tipo formali di M e sia essere del tipo formale parametri di N. Dopo aver rinominato ciascuna occorrenza di un Bi in caratteri di N ai i limiti della corrispon ding type variabili e il tipo di argomento di M e N sono gli stessi.

Quindi, due metodi con lo stesso nome e argomenti ma diverse eccezioni dichiarate, hanno la stessa firma.

Inoltre, da the document Bozho quotes:

Definizione: Due dei componenti di una dichiarazione metodo comprendono il metodo di firma nome di -il ​​metodo ei tipi di parametri .

Nessuna menzione di eccezioni là ...

EDIT: Per quanto riguarda l'override un metodo (o implementazione di un'interfaccia), da section 8.4.8.3:

una dichiarazione di metodo non deve avere un tiri clausola in conflitto (§8.4.6) con quella di qualsiasi metodo che sostituisce o nasconde ; in caso contrario, si verifica un errore in fase di compilazione .

+0

@ Jon Skeet Perché quindi non posso eseguire public void run() genera IOException in una classe che implementa Runnable? –

+0

Jon ha ragione :) Ma forse qualcosa che l'autore possa prendere in considerazione. È possibile dichiarare che i propri metodi generano un'eccezione più bassa nell'eccezione heirachy rispetto all'eccezione dichiarata nel metodo interface/super class e sarà comunque un'implementazione/override valida del metodo. – Justin

+0

@ Mi sta conoscendo bene: perché l'implementazione di un'interfaccia o la sovrascrittura di un metodo deve fare molto di più che abbinare semplicemente la firma. Inoltre deve evitare di dichiarare che genererà altre eccezioni controllate rispetto a quelle dichiarate. –