2011-08-28 5 views
19

Je travaille avec une API qui prétend retourner true si elle réussit, et false si elle échoue. Mais, il prétend également jeter des exceptions différentes si elle échoue. Comment peut-il retourner false et lancer une exception?Renvoie une valeur ET génère une exception?

Répondre

25

Il n'est pas possible de lancer une exception et de renvoyer une valeur à partir d'un seul appel de fonction.

Peut-être qu'il fait quelque chose comme retourner false s'il y a une erreur, mais en levant une exception si l'entrée n'est pas valide.

modifier: PaulPRO a affiché un (maintenant supprimé) réponse en soulignant qu'il est techniquement possible de faire une exception à être jeté dans un autre thread, en retournant une valeur dans l'actuel. Je pensais que cela valait la peine d'être noté, même si ce n'est pas quelque chose que vous devriez jamais voir.

+0

C'est ce que j'ai pensé. Je pensais qu'il pourrait y avoir un truc avec un bloc finalement si. – mark

+0

une fois qu'une exception est levée, votre programme cesse de fonctionner, donc il est impossible de faire les deux. Je me demande si vous avez une déclaration de retour dans votre bloc 'try', le programme passe-t-il toujours le bloc 'final', parce que si vous revenez une valeur dans le bloc try et mettez une exception Throws dans le bloc Final, J'ai fait les deux .. –

+2

@ Karel-Jan Misseghers: non, en Java, votre programme ** N'arrête pas de fonctionner ** une fois qu'une exception est levée. Vous êtes confus quant à la façon dont les exceptions Java fonctionnent et n'ont évidemment pas encore fait de programmation Java multi-thread. Vous pouvez avoir beaucoup de threads continuer à travailler quand une exception non cochée survient dans un autre thread. Il y a beaucoup de cas où le thread mourant est redémarré automagiquement (le plus connu étant EDT de Swing sur certains OS/JVM: si l'EDT meurt, un nouvel EDT est redémarré). – SyntaxT3rr0r

14

Vous pouvez lancer une exception a un (dans ce booléen cas) Valeur:

public class ValueException extends Exception { 
    final boolean value; 

    public ValueException(boolean value, String message) { 
     super(message); 
     this.value = value; 
    } 

    public boolean getValue() { 
     return value; 
    } 
} 
0

Bien qu'il soit possible d'écrire votre code de telle sorte qu'une exception et une valeur peuvent être dérivées d'un appel de fonction (voir les messages ci-dessus), il ne devrait JAMAIS être fait dans le bon codage.

J'aimerais voir un lien vers la documentation sur cette API. Les API doivent accorder la priorité à la clarté. Lancer une exception et retourner une valeur laisse la question de savoir si la valeur renvoyée est sûre à utiliser ou si elle est invalide. Souvenez-vous, les blocs try/catch sont la méthode OTHER de gestion des exceptions. Ils ne transmettent pas l'exception à la méthode appelante, mais la gèrent en interne d'une manière jugée appropriée par le développeur.

Si, à des fins de débogage, vous devez voir la valeur résultante dans le cas d'une exception, l'idée de Bohemian fonctionne bien.

Questions connexes