
La técnica de manejo de excepciones se basa, como se ha visto antes, en la captura de excepciones que ocurren al ejecutar las sentencias. (Ver Captura de una excepción)
Una pregunta que cabe hacerse es: «¿Cómo se conoce cuál es el tipo de excepción que puede generar un método?. Una forma natural de conocer esta cuestión es leer el código de los métodos, pero en la práctica, esto no es posible en métodos que son parte de grandes programas y, además llaman a otros métodos. Otra forma, es leer la documentación disponible sobre la clase y los métodos, y esperar que contenga información sobre los diferentes tipos de excepciones que se pueden generar. Desgraciadamente, tal información no siempre se puede encontrar.
Java ofrece una tercera posibilidad, que además, para evitar errores de sintaxis, obliga a utilizar. Consiste en declarar en la cabecera de los métodos las excepciones que puede generar. Esto se conoce como especificación de excepciones. La especificación lista las excepciones que un método puede lanzar. Garantiza que el método no lance ninguna otra excepción, a no ser las excepciones de tipo RuntimeException que no es necesario especificar. Los sistemas bien diseñados con manejo de excepciones necesitan definir que métodos lanzan excepciones y cuáles no. Con especificaciones de excepciones se describen exactamente cuáles excepciones, si existen, lanza el método.
El formato de especificación de excepciones es:
tipo nombreMetodo(signatura) throws e1, e2, en{
cuerpo del método
}
e1, e2, en; lista separada por comas de nombres de excepciones (la lista especifica que el método puede lanzar directa o indirectamente, incluyendo excepciones derivadas públicamente de estos nombres).
Java distingue en este aspecto dos tipos de excepciones: aquellas que se deben comprobar y aquellas que no es necesario. Estas últimas son las que se producen en expresiones aritméticas, índices de array fuera de rango, formato de conversión incorrecto. . .
En las excepciones que se deben comprobar, Java obliga a su captura con un bloque try-catch; o bien, a su propagación al método llamador, y para ello es necesario especificar en la cabecera del método que puede propagar la excepción con la cláusula throws seguida del nombre de la excepción; en caso contrario se produce un error de sintaxis, de compilación. Todas las excepciones que el programador define se deben comprobar. En general, todas las excepciones, excepto RuntimeException (y las de tipo Error), son las que se deben comprobar.
Sintácticamente, una especificación de excepciones es parte de una definición de un método. Formato:
tipo nombreMetodo(lista argumentos) throws lista excepciones
Ejemplo

Regla
Una especificación de excepciones sigue a la lista de argumentos del método. Se especifica con la palabra reservada throws seguida por una lista de tipos de excepciones, separadas por comas.
Regla
En la especificación de excepciones se sigue la regla en cuanto a conversión automática de tipo clase derivada a clase base. De tal forma que para expresar que se puede propagar o lanzar cualquier excepción:
tipo nombreMetodo(argumentos) throws Exception
Al ser Exception la clase base de todas las excepciones a comprobar.
Ejemplo
Métodos de la clase PilaTest con especificación de excepciones.
class PilaTest{
// . . .
public void quitar(int valor) throws EnPilaVaciaException{. . .}
public void meter(int valor) throws EnPilaLlenaException{. . .}
// . . .
}