3 Réponses :


6
votes

La description explique déjà une partie: l'exception est lancée lorsque vous utilisez la réflexion pour accéder à un champ ou invoquer une méthode qui n'est pas accessible; L'erreur est lancée lorsque vous le faites directement (et pour une raison quelconque, le compilateur n'avait pas la chance de l'attraper - par exemple lorsque vous avez une ancienne version d'un fichier de classe autour, dans lequel le champ ou la méthode que vous essayez d'utiliser est privée).

Un erreur indique normalement qu'il y a quelque chose de vraiment faux - il y a presque certainement un bogue dans le logiciel. Vous ne devriez jamais essayer d'attraper erreur s. Si vous attrapez le xxxexception , il n'y a pas de raison immédiate pour attraper également le xxxError . La documentation de 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. La plupart des erreurs de ce type sont des conditions anormales. L'erreur de filtration, bien que une condition "normale", est également une sous-classe d'erreur car la plupart des applications ne doivent pas essayer de l'attraper.

La méthode n'est pas nécessaire pour déclarer dans sa clause de lancement des sous-classes d'erreur pouvant être lancées lors de l'exécution de la méthode mais non capturée, car ces erreurs sont des conditions anormales qui ne devraient jamais se produire.

Un exemple pour générer IllegalAccessException : via la réflexion, consultez une méthode privée dans une classe et essayez de l'appeler.

Un exemple pour générer IllegalAccessError : Créez deux classes et enregistrez-les dans deux fichiers source a.java et b.java . En classe A , crée une méthode publique et dans la classe b , appelez cette méthode. Compiler les fichiers source. Maintenant, éditez a.java et crée la méthode privée et recompille uniquement a.java (pas b.java ). Maintenant essayez de courir à nouveau; B essaiera d'appeler la méthode et de lancer un illegalAccessError .

Il existe d'autres paires de xxxException / xxxError qui semblent liés, mais ils n'ont pas toujours exactement les noms correspondants; Par exemple ClassNotFoundException / NOCLASSDEFFUTERORROR .


0 commentaires

1
votes

Il y a plusieurs paires d'exception / erreur dans java.lang code> et la totalité de la transaction suivante avec réfléchissant ou utilisation directe: xxx pré>

D'autres exemples sont : P>

java.awt.AWTException / java.awt.AWTError
java.io.IOException / java.io.IOError


1 commentaires

Les Javadocs n'istent que "utilisations" d'une classe pouvant être déduites des signatures visibles. Les exceptions d'erreur sont rarement (de tous les temps) déclarées dans lancent des clauses , de sorte que l'outil Javadoc ne sait donc pas à leur sujet.



9
votes

Quelqu'un peut-il donner un exemple de code où chacun est lancé?

Le IllegalAccessException est lancé lorsque vous essayez d'utiliser la réflexion pour invoquer une méthode ou lire ou écrire un champ interdit par les règles de visibilité Java.

Un IllegalAccessError ne peut pas être lancé par un code Java compilé systématiquement. Il se produit quand par exemple, vous chargez une classe qui tente d'invoquer une méthode ou de lire ou d'écrire un champ dans une autre classe interdite par les règles de visibilité Java. C'est quelque chose que le compilateur empêcherait normalement, cela signifie donc qu'il y a quelque chose de sérieusement mal avec les classes. En tout cas, cela est considéré comme une "erreur"; I.e. non récupérable, et le chargeur de classe refusera de charger la classe infractions.

La similarité de Nom implique-t-elle une relation entre les deux, ou est-ce juste une coïncidence pure?

Il y a une relation claire entre les deux. La différence est les circonstances dans lesquelles les deux se produisent.

Y a-t-il d'autres combo xxxError et xxxException? Comment les paires sont-elles liées les unes aux autres?

passe. Vérifiez les Javadocs.

Si vous essayez explicitement d'en prendre un dans une paire d'exception / erreur, devriez-vous aussi attraper l'autre?

Probablement pas. La XXXError et la xxxException se produisent généralement dans différentes circonstances. (Cela s'applique certainement aux celles de la classes réfléchissantes.)

En outre, en règle générale, vous ne devriez pas essayer d'attraper et de récupérer des sous-types de erreur . L'ensemble point de séparation d'erreur de exception est de distinguer les exceptions non récupérables et (potentiellement) récupérables.

Dans ce cas, il n'y a rien qu'une application normale puisse faire de la récupération du illegalAccessError . Si vous essayez de répéter l'opération ClassLoader qui a causé le problème, cela se reproduira simplement.


1 commentaires

Très bonne réponse! En outre, c'est pourquoi Catch (Distanrable T) {} sans Thuk T; est vraiment mauvaise nouvelle; Les erreurs d'alimentation accidentelle peuvent faire échouer votre programme spectaculairement, y compris le refus d'être tué sans traiter de manière forcée.