Java Language La clause 'throws' dans une déclaration de méthode


Exemple

Le mécanisme d' exception vérifié de Java nécessite que le programmeur déclare que certaines méthodes peuvent générer des exceptions vérifiées spécifiées. Ceci est fait à l' aide de la throws clause. Par exemple:

public class OddNumberException extends Exception { // a checked exception
}

public void checkEven(int number) throws OddNumberException {
    if (number % 2 != 0) {
        throw new OddNumberException();
    }
}

throws OddNumberException déclenche une throws OddNumberException indiquant qu'un appel à checkEven peut checkEven une exception de type OddNumberException .

Une throws clause peut déclarer une liste des types, et peut inclure des exceptions non vérifiées ainsi que les exceptions vérifiées.

public void checkEven(Double number) 
        throws OddNumberException, ArithmeticException {
    if (!Double.isFinite(number)) {
        throw new ArithmeticException("INF or NaN");
    } else if (number % 2 != 0) {
        throw new OddNumberException();
    }
}

Quel est l'intérêt de déclarer des exceptions non vérifiées comme levées?

La throws clause dans une déclaration de méthode a deux objectifs:

  1. Il indique au compilateur quelles exceptions sont générées pour que le compilateur puisse signaler les exceptions non détectées (vérifiées) en tant qu'erreurs.

  2. Il indique à un programmeur qui écrit du code qui appelle la méthode quelles exceptions attendre. À cette fin, il est souvent logique d'inclure des exceptions non vérifiées dans une liste de throws .

Remarque: la liste de throws est également utilisée par l’outil javadoc lors de la génération de la documentation de l’API, ainsi que par les astuces de la méthode typique de texte de survol de l’EDI.

Les jetons et la méthode

Les throws formes clause partie de la signature d'une méthode dans le but de passer outre la méthode. Une méthode de substitution peut être déclarée avec le même ensemble d'exceptions vérifiées que celles générées par la méthode substituée ou avec un sous-ensemble. Toutefois, la méthode de remplacement ne peut pas ajouter des exceptions vérifiées supplémentaires. Par exemple:

@Override
public void checkEven(int number) throws NullPointerException // OK—NullPointerException is an unchecked exception
    ...

@Override
public void checkEven(Double number) throws OddNumberException // OK—identical to the superclass
    ...

class PrimeNumberException extends OddNumberException {}
class NonEvenNumberException extends OddNumberException {}

@Override
public void checkEven(int number) throws PrimeNumberException, NonEvenNumberException // OK—these are both subclasses

@Override
public void checkEven(Double number) throws IOExcepion         // ERROR

La raison de cette règle est que si une méthode de substitution peut lancer une exception vérifiée que la méthode surchargée ne peut pas lancer, cela pourrait casser la substituabilité du type.