Pourquoi "throws Exception" nécessaire lors de l'appel d'une fonction?


class throwseg1
{
    void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

    void show2() throws Exception  // Why throws is necessary here ?
    {
        show();
    }

    void show3() throws Exception  // Why throws is necessary here ?
    {
        show2();
    }

    public static void main(String s[]) throws Exception  // Why throws is necessary here ?
    {
        throwseg1 o1 = new throwseg1();
        o1.show3();
    }
}

Pourquoi le compilateur signale que les méthodes show2(), show3(), et main() ont

Exception non déclarée Exception qui doit être interceptée ou déclarée levée

Quand je supprime throws Exception de ces méthodes?

Author: user2864740, 2012-07-21

6 answers

En Java, comme vous le savez peut-être, les exceptions peuvent être classées en deux: Une qui nécessite la clause throws ou doit être gérée si vous ne spécifiez pas l'une et une autre qui ne le fait pas. Maintenant, voir la figure suivante:

entrez la description de l'image ici

En Java, vous pouvez lancer tout ce qui étend la classe Throwable. Cependant, vous n'avez pas besoin de spécifier une clause throws pour toutes les classes. Plus précisément, les classes qui sont soit un Error ou RuntimeException ou l'une des sous-classes de ces deux. Dans votre cas, Exception n'est pas un sous-classe d'un Error ou RuntimeException. Donc, c'est une exception vérifiée et doit être spécifiée dans la clause throws, si vous ne gérez pas cette exception particulière. C'est pourquoi vous aviez besoin de la clause throws.


À Partir De Java Tutoriel:

Une exception est un événement qui se produit pendant l'exécution d'un programme, qui perturbe le flux normal des instructions du programme.

Maintenant, comme vous le savez, les exceptions sont classées en deux: cochées et non cochées. Pourquoi ces classement?

Exception vérifiée: Ils sont utilisés pour représenter les problèmes qui peuvent être récupérés lors de l'exécution du programme. Ils ne sont généralement pas la faute du programmeur. Par exemple, un fichier spécifié par l'utilisateur n'est pas lisible, ou aucune connexion réseau disponible, etc., Dans tous ces cas, notre programme n'a pas besoin de quitter, au lieu de cela, il peut prendre des actions comme alerter l'utilisateur, ou entrer dans un mécanisme de secours (comme le travail hors ligne lorsque le réseau n'est pas disponible), etc.

Exceptions non cochées: Elles peuvent à nouveau être divisées en deux: Errors et RuntimeExceptions. L'une des raisons pour lesquelles ils ne sont pas cochés est qu'ils sont nombreux, et que le fait de les gérer tous encombrera notre programme et réduira sa clarté. L'autre raison est:

  • Exceptions d'exécution: Elles se produisent généralement en raison d'une faute des programmeurs. Par exemple, si un ArithmeticException de la division par zéro se produit ou un ArrayIndexOutOfBoundsException se produit, c'est parce que nous sommes pas assez prudent dans notre codage. Ils se produisent généralement parce que certaines erreurs dans notre logique de programme. Ils doivent donc être effacés avant que notre programme ne passe en mode production. Ils ne sont pas cochés dans le sens où, notre programme doit échouer quand il se produit, de sorte que nous les programmeurs pouvons le résoudre au moment du développement et du test lui-même.

  • Erreurs: Les erreurs sont des situations à partir desquelles le programme ne peut généralement pas récupérer. Par exemple, si un StackOverflowError se produit, notre programme ne peut pas faire beaucoup, comme augmenter la taille de la pile d'appel de fonction du programme. Ou si un OutOfMemoryError se produit, nous ne pouvons pas faire grand-chose pour augmenter la quantité de RAM disponible pour notre programme. Dans de tels cas, il est préférable de quitter le programme. C'est pourquoi ils sont faits décochée.

Pour des informations détaillées, voir:

 107
Author: Jomoos, 2017-11-25 16:00:41

Java nécessite de gérer ou de déclarer toutes les exceptions. Si vous ne gérez pas une exception à l'aide d'un bloc try/catch, elle doit être déclarée dans la signature de la méthode.

Par exemple:

class throwseg1 {
    void show() throws Exception {
        throw new Exception();
    }
}

Devrait être écrit comme:

class throwseg1 {
    void show() {
        try {
            throw new Exception();
        } catch(Exception e) {
            // code to handle the exception
        }
    }
}

De cette façon, vous pouvez vous débarrasser de la déclaration "throws Exception" dans la déclaration de méthode.

 21
Author: jebar8, 2012-07-21 04:13:38

Exception est une classe d'exception vérifiée. Par conséquent, tout code qui appelle une méthode qui déclare qu'elle throws Exception doit la gérer ou la déclarer.

 3
Author: Taymon, 2012-07-21 03:53:50

La déclaration throws Exception est un moyen automatisé de suivre les méthodes qui pourraient déclencher une exception pour des raisons anticipées mais inévitables. La déclaration est généralement spécifique au type ou aux types d'exceptions pouvant être levées, telles que throws IOException ou throws IOException, MyException.

Nous avons tous ou finirons par écrire du code qui s'arrête de manière inattendue et signale une exception due à quelque chose que nous n'avions pas anticipé avant d'exécuter le programme, comme la division par zéro ou l'index hors limites. Depuis le les erreurs n'étaient pas attendues par la méthode, elles ne pouvaient pas être "capturées" et traitées avec une clause try catch. Tous les utilisateurs sans méfiance de la méthode ne seraient pas non plus au courant de cette possibilité et leurs programmes s'arrêteraient également.

Lorsque le programmeur sait que certains types d'erreurs peuvent se produire mais souhaite gérer ces exceptions en dehors de la méthode, la méthode peut "lancer" un ou plusieurs types d'exceptions à la méthode appelante au lieu de les gérer. Si le programmeur n'a pas déclaré que la méthode (pourrait) lancer une exception (ou si Java n'avait pas la capacité de la déclarer), le compilateur ne pouvait pas le savoir et il appartiendrait au futur utilisateur de la méthode de connaître, d'attraper et de gérer toutes les exceptions que la méthode pourrait lancer. Étant donné que les programmes peuvent avoir de nombreuses couches de méthodes écrites par de nombreux programmes différents, il devient difficile (impossible) de garder une trace des méthodes susceptibles de générer des exceptions.

Même si Java a la capacité de déclarer des exceptions, vous pouvez toujours écrivez une nouvelle méthode avec des exceptions non gérées et non déclarées, et Java la compilera et vous pourrez l'exécuter et espérer le meilleur. Ce que Java ne vous laissera pas faire, c'est compiler votre nouvelle méthode si elle utilise une méthode qui a été déclarée comme jetant des exceptions, sauf si vous gérez les exceptions déclarées dans votre méthode ou déclarez votre méthode comme jetant les mêmes exceptions ou s'il y a plusieurs exceptions, vous pouvez gérer certaines et lancer le reste.

Lorsqu'un programmeur déclare que la méthode lève un type spécifique d'exception, c'est juste un moyen automatisé d'avertir les autres programmeurs utilisant la méthode qu'une exception est possible. Le programmeur peut alors décider de gérer l'exception ou de transmettre l'avertissement en déclarant que la méthode appelante lance également la même exception. Comme le compilateur a été averti que l'exception est possible dans cette nouvelle méthode, il peut automatiquement vérifier si les futurs appelants de la nouvelle méthode gèrent l'exception ou la déclarent et l'appliquent l'un ou l'autre à se produire.

La bonne chose à propos de ce type de solution est que lorsque le compilateur signale Error: Unhandled exception type java.io.IOException il donne le numéro de fichier et de ligne de la méthode déclarée pour lever l'exception. Vous pouvez ensuite choisir de simplement passer le buck et déclarer votre méthode également "jette IOException". Cela peut être fait jusqu'à la méthode principale où cela provoquerait alors l'arrêt du programme et signalerait l'exception à l'utilisateur. Cependant, il est préférable d'attraper l'exception et de traiter avec dans une jolie manière d'expliquer à l'utilisateur ce qui s'est passé et comment le résoudre. Lorsqu'une méthode attrape et gère l'exception, elle n'a plus à déclarer l'exception. Le mâle s'arrête là pour ainsi dire.

 3
Author: dansalmo, 2014-10-29 02:57:36
package javaexception;


public class JavaException {
   void show() throws Exception
    {
        throw new Exception("my.own.Exception");
    }

void show2() throws Exception  // Why throws is necessary here ?
{
    show();
}

void show3() throws Exception  // Why throws is necessary here ?
{
    show2();
}
public static void main(String[] args) {

   JavaException a = new JavaException();

   try{
   a.show3();
   }catch(Exception e){
       System.out.println(e.getMessage());
   }
}

Seulement de petits changements dans votre programme. Ce qu'il semble être mal compris par beaucoup en ce qui concerne le problème principal, c'est que chaque fois que vous lancez une exception, vous devez la gérer, pas nécessaire au même endroit ( ex. show1, 2, 3 méthode dans votre programme) mais vous devez d'abord appeler la méthode à l'intérieur du 'main'. en un mot, il est "jeter", il faut " attraper/essayez, même si ce n'même méthode lorsqu'une exception se produit.

 0
Author: tawess, 2018-03-15 08:11:39
void show() throws Exception
{
    throw new Exception("my.own.Exception");
}

Comme il y a une exception vérifiée dans la méthode show (), qui n'est pas gérée dans cette méthode, nous utilisons donc le mot clé throws pour propager l'exception.

void show2() throws Exception //Why throws is necessary here ?
{
show();
}

Puisque vous utilisez la méthode show() dans la méthode show2() et que vous avez propagé l'exception au moins, vous devriez gérer ici. Si vous ne gérez pas l'exception ici, vous utilisez le mot clé throws. C'est donc la raison de l'utilisation du mot clé throws à la signature de la méthode.

 0
Author: Aditya, 2018-04-08 17:43:33