IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Deux questions en Java


Sujet :

avec Java

  1. #1
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut Deux questions en Java
    Bonsoir à toutes et à tous,

    Je me suis trouvé face à deux questions (QCM) en JAVA que j'aimerais bien avoir quelques explications:

    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    interface MaClasse { String toString(); }
     
    public class TestMaClasse {
     
         public static void main(String[] args){
     
          System.out.println(new MaClasse {
     
            public String toString() { return "Trois jetons"; }
          });
         }
    }
    Le résultat de l'exécution est "Trois jetons", ce qui est bizarre pour moi ici c'est que: comment on peut faire new pour une interface (MaClasse) ?!!


    2-

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    public class MonThread implements Runnable {
     
           public void run(){
              System.out.println("Je suis dans run");
              throw new RuntimeException("Piege");
           }
     
          public static void main(String[] args){
     
          Thread th = new Thread(new MonThread());
          th.start();
          System.out.println("Fin du programme");
          }
    }
    Comment le compilateur peut atteindre la dernière ligne et afficher "Fin du programme" alors que dans la méthode run(), on a une instructionde throw... ce qui signifie , NORMALEMENT, qu'au niveau de ( th.start() ) on aura une exception et le programme va s'arrêter, nn?


    Merci pour vous.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    1) Oui on peut car on ne fait pas de new de l'interface.
    On fait une classe anonyme qui implémente cette interface.
    cela donne :
    new MaClasse { ... ici le code de la classe ... }

    et
    toString() { return "Trois jetons"; }
    est l'implémentation concrète de la méthode exigée par l'interface



    2) après l'exécution de th.start(); le thread est lancé et donc exécuté "dans son coin" sans que le programme principal ne s'en occupe plus.
    du coup l'instruction située immédiatement après System.out.println("Fin du programme"); est bien exécutée peut importe ce qui se passe dans l'autre thread

    d'ailleurs dans ce cas, l'affichage de "Fin du programme" dans la console est un pur mensonge car l'autre thread peut ne pas être terminé !
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par L'aigle de Carthage Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    interface MaClasse { String toString(); }
    
    public class TestMaClasse {
    
         public static void main(String[] args){
    
          System.out.println(new MaClasse() {
    
            public String toString() { return "Trois jetons"; }
          });
         }
    }
    le compilateur crée pour vous une classe anonyme qui implémente l'interface.


    Citation Envoyé par L'aigle de Carthage Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    public class MonThread implements Runnable {
     
           public void run(){
              System.out.println("Je suis dans run");
              throw new RuntimeException("Piege");
           }
     
          public static void main(String[] args){
     
          Thread th = new Thread(new MonThread());
          th.start();
          System.out.println("Fin du programme");
          }
    }
    Comment le compilateur peut atteindre la dernière ligne et afficher "Fin du programme" alors que dans la méthode run(), on a une instructionde throw... ce qui signifie , NORMALEMENT, qu'au niveau de ( th.start() ) on aura une exception et le programme va s'arrêter, nn?
    le thread s'exécute de manière asynchrone et comme vous n'avez aucun mécanisme de rendez-vous (join) entre le programme principal et le thread secondaire, ce qui se passe est tout simplement que le programme principal continue son exécution avant même que le dispatcher ait pu démarrer le thread secondaire et le throw n'a jamais le temps d'être exécuté : la sortie du programme principal "tue" tous les threads secondaires.

  4. #4
    Débutant  
    Inscrit en
    Mai 2006
    Messages
    705
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 705
    Points : 117
    Points
    117
    Par défaut
    Donc, si j'avais bien compris:

    L'instruction "System.out.println("Fin du programme");" sera toujours exécuté!!!

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par L'aigle de Carthage Voir le message
    Donc, si j'avais bien compris:

    L'instruction "System.out.println("Fin du programme");" sera toujours exécuté en premier!!!
    Elle s'exécute dans un thread différent de celui où s'exécute throw new RuntimeException("Piege");.
    Des threads s'exécutent en parallèle et indépendamment les uns des autres. On ne peut pas prédire lesquelles de ces deux lignes sera exécutée en premier, d'ailleurs elles peuvent être exécutées en même temps.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    vinou92340
    Invité(e)
    Par défaut
    Petite question de débutant. Comment se fait il que le system.out.println de new MaClasse renvoie une valeur alors que l'on ne fait que définir la méthode toString() mais qu'elle n'est pas appelée explicitement ?


    Petit ajout: le system.out.println ferait il automatiquement appel à la méthode "toString()" de l'objet passé en paramètre dans le cas où cet objet n' est pas un objet de type String ? A y reflechir, cela serait logique vu que cette méthode est présente dans pas mal de classes.
    Dernière modification par vinou92340 ; 28/12/2012 à 23h34.

  7. #7
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Citation Envoyé par vinou92340
    Petite question de débutant. Comment se fait il que le system.out.println de new MaClasse renvoie une valeur alors que l'on ne fait que définir la méthode toString() mais qu'elle n'est pas appelée explicitement ?
    Parce que, lors de l'affichage d'une classe, c'est sa méthode toString() qui est invoquée.

    Écrire System.out.println(unObjet); est équivalent à System.out.println(unObjet.toString());.

    toString() est une méthode présente dans toutes les classes, car présente dans le parent général Object.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  8. #8
    vinou92340
    Invité(e)
    Par défaut
    Je te remercie pour l'information.

Discussions similaires

  1. [Débutant] Deux questions sur la conversion (cast)
    Par kloss dans le forum Langage
    Réponses: 7
    Dernier message: 18/02/2006, 19h46
  2. Deux questions
    Par sheira dans le forum ASP
    Réponses: 10
    Dernier message: 25/11/2005, 12h49
  3. [Together] Deux questions sur Borland Together UML
    Par srvremi dans le forum Autres
    Réponses: 4
    Dernier message: 02/11/2005, 09h32
  4. [Débutant] Deux questions concernants les vues
    Par 13obscur dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 19/04/2005, 14h29
  5. deux questions
    Par Invité4 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/03/2005, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo