• [^] # Re: En vrac

    Posté par . En réponse au journal Pourquoi empaqueter KDE prend-il du temps ?. Évalué à 2.

    Ça fait un bon moment que je n'ai pas fait de Java, mais je ne vois pas ce qui m'empêche de faire ceci (attention, mon style en Java va sentir bon le cru 2005, je préviens :-) :

    public class BaseCase {
     public static void main (String[] args) {
     try {
     BaseCase.compute(10);
     } catch (Exception e) { 
     System.out.println(e);
     }
     }
     public static void compute(int n) throws Exception {
     System.out.println("Computing...");
     if (n == 0) {
     throw new Exception("Base case reached!");
     } else {
     compute(n-1);
     }
     }
    }

    ... Où comment court-circuiter la pile d'appels récursifs pour « sortir » d'une récursion profonde (enfin c'est plus compliqué que ça, mais je pense que tu vois où je veux en venir). Alors oui en Java tu es forcé d'annoncer que tu jettes des exceptions et lesquelles, mais tu peux à peu près toujours jeter une exception de base juste pour marquer un endroit du control-flow qui t'intéresse, et oui tes méthodes d'instance et de classe vont dire « throws Exception ». Ça n'empêche pas que tu vas potentiellement utiliser un code qui s'appuie sur les exceptions pour faire des choses crades et « sauter » d'un appel de fonction à l'autre. Comme je le disais avant, évidemment c'est plus limité qu'un goto classique, mais il est quand même relativement aisé de voir comment un programmeur peut être « perverti » par la puissance qu'apportent les exceptions.

    Sinon, il y a longtemps, j'avais un chef de projet qui avait sans doute été brûlé avec la gestion des exceptions en C++ (qui, il faut bien l'avouer, est plus compliquée qu'en Java), et qui du coup nous avait interdit/fortement déconseillé de les utiliser, et du coup faisait ceci:

    String errStr = "";
    while ( true ) {
     errStr = "Condition1 a échoué";
     if ( !condition1 ) break;
     // ...
     errStr = "Condition2 a échoué";
     if ( !condition2 ) break;
     // ...
     // etc.
    }

    ... Et du coup on avait le droit à une « re-création » du goto limitée à un bloc de code ...