92 votes

Quand utiliser throws dans une déclaration de méthode Java ?

Je pensais avoir une bonne compréhension de base du traitement des exceptions en Java, mais j'ai récemment lu du code qui m'a donné quelques confusions et doutes. Le principal doute que je veux aborder ici est de savoir quand une personne doit utiliser throws dans une déclaration de méthode Java comme la suivante :

    public void method() throws SomeException
    {
         // method body here
    }

En lisant des messages similaires, j'ai compris que jette est utilisé comme une sorte de déclaration que SomeException pourraient être lancées pendant l'exécution de la méthode.

Ma confusion vient d'un code qui ressemblait à ceci :

     public void method() throws IOException
     {
          try
          {
               BufferedReader br = new BufferedReader(new FileReader("file.txt"));
          }
          catch(IOException e)
          {
               System.out.println(e.getMessage());
          }
     }

Y a-t-il une raison pour laquelle vous voudriez utiliser un jette dans cet exemple ? Il semble que si vous ne faites qu'un traitement de base des exceptions, comme une exception IOException, vous n'avez besoin que du bloc try/catch et c'est tout.

87voto

hvgotcodes Points 55375

Si vous attrapez un type d'exception, vous n'avez pas besoin de la lancer, sauf si vous avez l'intention de la relancer. Dans l'exemple que vous postez, le développeur aurait dû faire l'un ou l'autre, pas les deux.

En général, si vous n'avez pas l'intention de faire quoi que ce soit avec l'exception, vous ne devez pas l'attraper.

La chose la plus dangereuse que vous puissiez faire est d'attraper une exception et de ne rien en faire.

Une bonne discussion sur les cas où il est approprié de lancer des exceptions se trouve ici.

Quand lancer une exception ?

26voto

Shane Bell Points 598

Vous ne devez inclure une clause throws sur une méthode que si la méthode lève une exception vérifiée. Si la méthode lève une exception d'exécution, il n'est pas nécessaire de le faire.

Voir ici pour plus d'informations sur les exceptions vérifiées et non vérifiées : http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

Si la méthode attrape l'exception et la traite en interne (comme dans votre deuxième exemple), il n'est pas nécessaire d'inclure une clause throws.

9voto

Damo Points 7792

Le code que vous avez regardé n'est pas idéal. Vous devriez soit :

  1. Attrapez l'exception et traitez-la ; auquel cas le throws est inutile.

  2. Retirer le try/catch dans ce cas l'exception sera traitée par une méthode d'appel.

  3. Attraper l'exception, éventuellement effectuer une action, puis relancer l'exception (pas seulement le message)

2voto

RevBingo Points 135

Vous avez raison, dans cet exemple, le throws est superflue. Il est possible qu'il ait été laissé là par une implémentation précédente - peut-être que l'exception a été initialement levée au lieu d'être attrapée dans le bloc catch.

1voto

DaveJohnston Points 5475

Dans l'exemple que vous avez donné, la méthode ne lèvera jamais une IOException, donc la déclaration est erronée (mais valide). Je pense que la méthode d'origine a déclenché l'exception IOException, mais qu'elle a ensuite été mise à jour pour gérer cette exception, sans que la déclaration soit modifiée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X