11
votes

Est un bloc de capte capable d'attraper une "erreur et exception)

Dans l'une de mes entrevues, ils m'ont demandé, est-il possible d'écrire une jante dans la prise () comme celle-ci xxx

j'ai dit oui. Il ne donnera pas une erreur de temps de compilation, mais JVM ne le gérera pas s'il se produit une erreur (Sous-classe de lanceurs), car les erreurs sont des conditions irréversibles qui ne peuvent pas être traitées par JVM. que ce qu'ils ont encore demandé que quelles sont l'utilisation d'écriture lancinable.

S'il vous plaît, donnez-moi une réponse appropriée Pouvons-nous utiliser des prises jadis. Si oui pourquoi.


1 commentaires

J'utilise des questions de ce genre comme moyen de déshausser les endroits où je ne voudrais pas travailler, que ce soit parce que le code existant doit être trop délicat ou que les gestionnaires sont trop obsédés par le fait qu'ils connaissent des anecdotes sur la programmation Langue leurs sous-vêtements utilisent, ou quelque chose même pire ...


5 Réponses :


13
votes

Il est possible d'attraper jetable . Et oui, vous attrapez également des instances de java.lang.error qui est un problème lorsqu'il s'agit de par ex. OutofMemoryError 's. En général, je n'approcherais pas lancoir . Si vous devez, vous devez le faire au plus haut lieu de votre pile d'appels, par ex. La méthode (vous souhaiterez peut-être l'attraper, le loger et le retirez-le).

Je suis d'accord avec votre argumentation, il n'a pas de sens à attraper des événements que vous ne pouvez pas gérer (par ex. OutofMemoryError). Un bel message est ici .


4 commentaires

Mais que sera la sortie. le programme sera-t-il vraiment manipulé sur OutofMemoryError ou JVM Wil s'arrêter toujours


@ROMI - Pourquoi ne pas écrire un programme de test et savoir? Exécutez votre test contre divers JVMS, puis coupez-vous vraiment l'intervieweur lorsque vous vous demandez la question suivante!


@ROMI - La Sortie est que l'OutOfMemoryError (ou tout autre lanceur) sera saisi, interrompre le processus réel à l'intérieur du bloc d'essai, puis ignoré (puisque le bloc de capture est vide). Mais il y a une grande chance que le traitement ultérieur ne fonctionne pas parce que le manque de mémoire.


Je fais cela lors de l'exécution de rappels surtout si ceux-ci sont appelés multiplicateurs. Il permet à mon programme de récupérer et de signaler éventuellement le rappel comme Errorneue et de ne pas l'utiliser à nouveau si l'erreur se répète.



1
votes

Dressable peut être utilisé au lieu de toute exception / erreur individuelle. Cependant, il est recommandé de traverser la threaddeadException. Vous pouvez donc ajouter une clause de capture supplémentaire pour cela, ou filtrer par type.


1 commentaires

1) C'est ce qu'on appelle threaddeath pas threaddeadexception . 2) Vous ne le verrez jamais que si vous utilisez la méthode de la méthode thread.Destroy à long terme () . Ne fais pas ça. 3) En fait, il est recommandé de ne pas attraper une erreur erreur ; I.e. java.lang.error et toutes ses sous-classes.



2
votes

Oui, il est possible d'attraper jetable .

Si la JVM / Demande sera en mesure de continuer si vous attrapez une erreur dépend de l'erreur réelle survenue, qu'est-ce qui l'a provoquée et quoi (si quelque chose) votre application fait ensuite.

  • Dans certains cas, la JVM peut être de mauvaise manière dont aucune récupération n'est possible.

  • Dans certains cas, la JVM va bien ... tant que vous ne faites pas certaines choses. Les erreurs de chargement de la classe sont un bon exemple. Si votre application ne tente pas d'utiliser les classes de classe ou de dépendance que vous avez échoué, vous devez continuer à continuer. (En réalité, les applications ne sont pas conçues pour continuer sans classes qui ne parviennent pas à se charger ... mais si c'était, cela pourrait.)

  • Dans certains cas, le CORE JVM ira bien, mais des dommages non spécifiés auraient pu être causés aux structures de données de l'application et / ou à son état de threads et de calcul. Les oomes sont susceptibles de vous faire cela, surtout si votre application n'est pas conçue pour traiter des threads décédés de manière inattendue.

  • attraper et récupérer des oomes est problématique pour une autre raison. Bien que la résiliation du calcul actuel libérera un tas de tas, il y a de bonnes chances qu'il ne vous libère pas assez l'espace. Donc, vous pouvez facilement entrer dans une situation dans laquelle votre application lance et attrape de nombreux oomies, et ne faisant aucun progrès réel.

    Tout cela signifie qu'il s'agit généralement d'une mauvaise idée d'essayer de récupérer des erreurs. Et cela est conforme à ce que le Javadoc pour erreur dit:

    "Une erreur est une sous-classe de lanceurs qui indique de graves problèmes qu'une application raisonnable ne devrait pas essayer d'attraper."


0 commentaires

0
votes

Catching Dressable attrapera toutes les exceptions (y compris les runtimédies) et toutes les erreurs. Il n'est pas recommandé d'attraper l'une des litiges parent (jetables, d'erreur, d'exception ou de la runtimédiexception), mais il n'est pas rare de la trouver si une méthode jette trop d'exceptions vérifies ou jette une exception.

Il n'est pas rare dans certaines API documenter une méthode comme étant une exception. Cela fournit une certaine flexibilité au détriment du contrôle. J'aime définir une nouvelle classe d'exception pour gérer ce type de cas, mais c'est la préférence personnelle. P>

La classe simple suivante montre des échantillons des types de jeton et des blocs de capture correspondants. P>

public class ThrowableExamples {

    public static void main(String[] args) {
        try {
//          throw new NoSuchMethodException("Exception");
//          throw new Exception("Exception");
//          throw new IllegalStateException("RuntimeException");
//          throw new RuntimeException("RuntimeException");
            throw new NoSuchMethodError("Error");
//          throw new Error("Error");
//          throw new Throwable("Throwable");

        } catch (RuntimeException e) {
            System.out.println("Caught RuntimeException: " +  (e.getMessage().equals("RuntimeException") ? "Expected" : "Unexpected"));

        } catch (Exception e) {
            System.out.println("Caught Exception: " +  (e.getMessage().equals("Exception") ? "Expected" : "Unexpected"));

        } catch (Error e) {
            System.out.println("Caught Error: " +  (e.getMessage().equals("Error") ? "Expected" : "Unexpected"));

        } catch (Throwable e) {
            System.out.println("Caught Throwable: " +  (e.getMessage().equals("Throwable") ? "Expected" : "Unexpected"));
        }
    }
}


0 commentaires

2
votes
  • Oui, nous pouvons attraper jetables mais aussi la meilleure pratique, il n'est pas conseillé d'attraper jetable .
  • attraper jetable inclut les erreurs aussi, nous ne devrions pas attraper des erreurs, cela aide à identifier les problèmes de la JVM.

0 commentaires