2010-05-07 11 views
12

¿La especificación de excepción es una parte de la firma del método? Lo que quiero decir es:Excepción Especificación

public void someMethod(String myString) throws IOException 

es 'throws IOException' una parte de una firma de este método?

Gracias

Respuesta

6

seguimiento a Jon Skeet's answer y en respuesta a la observación

@ Jon Skeet ¿Por qué entonces no puedo tener public void run() throws IOException en una clase que implementa Ejecutable? - Sabiendo que te conozco

Sección 8.4.6 de la especificación del lenguaje Java (3ª edición) dice:

Un método que anula o se esconde otro método (Sección 8.4.8), incluyendo los métodos que implementan abstract métodos definidos en las interfaces, no pueden declararse a echar más verificó excepciones que el método anulado u oculto.

Más precisamente, supongamos que B es una clase o interfaz, y A es una superclase o superinterfaz de B, y una declaración de método n en B anulaciones u oculta una declaración de método m en A. Si n tiene una cláusula throws que menciona cualquier tipo de excepción revisadas, a continuación, m debe tener una cláusula de throws, y por cada comprobado tipo de excepción que figuran en el throws cláusula de n, esa misma clase de excepción o una de sus supertipos debe ocurrir en el borrado de la cláusula throws de m; de lo contrario, se produce un error en tiempo de compilación.

No se trata aquí de la firma del método, sino de no exigir que las personas que llaman tengan en cuenta las excepciones que no se deben verificar con el método 'original' al que llaman.

5

No. Desde section 8.4.2 of the Java Language Spec:

dos métodos tienen la misma firma si que tienen el mismo nombre y el argumento tipos.

Dos método o constructor declaraciones M y N tienen los mismos tipos de argumentos si todas las condiciones siguientes espera:

Tienen el mismo número de formales parámetros (posiblemente cero) Se han la misma número de parámetros de tipo (posiblemente cero) sea la parámetros de tipo formal de M y vamos ser el tipo formal de parámetros de N. Después de cambiar el nombre de cada ocurrencia de un Bi en el tipo de N a Ai de los límites de correspon ding tipo variables y los tipos de argumento de M y N son lo mismo.

Así que dos métodos con el mismo nombre y argumentos, pero diferentes excepciones declaradas, que tienen la misma firma.

Además, desde the document Bozho quotes:

Definición: Dos de los componentes de una declaración método comprenden la método firma nombre de -el método y los tipos de parámetros.

No se hace mención de las excepciones allí ...

EDIT: En cuanto a sustituir un método (o la aplicación de una interfaz), desde section 8.4.8.3:

una declaración de método no debe tener un tiros cláusula que entra en conflicto (§8.4.6) con la de cualquier método que anule u oculta; de lo contrario, se produce un error de tiempo de compilación .

+0

@ Jon Skeet ¿Por qué entonces no puedo tener public void run() lanza IOException en una clase que implementa Runnable? –

+0

Jon tiene razón :) Pero tal vez algo para que el autor tome nota. Puede declarar que sus métodos arrojan una excepción que es menor en la excepción heirachy que la excepción declarada en el método interfaz/superclase y seguirá siendo una implementación/anulación válida del método. – Justin

+0

@Saber que te conozco: porque implementar una interfaz o reemplazar un método tiene que hacer mucho más que solo hacer coincidir la firma. También debe evitar declarar que arrojará más excepciones marcadas que las declaradas. –

Cuestiones relacionadas