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

Langage Java Discussion :

Où se trouve le code source de la division par zéro ?


Sujet :

Langage Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut Où se trouve le code source de la division par zéro ?
    Bonjour

    J'ai un souci avec le code source des classes de l'API Java. Quand je prends par exemple la division par zéro, c'est la Class ArithmeticException qui gére les messages d'erreur. J'ai le message suivant qui m'est affiché lorsque je tente la division par zéro:

    Exception in thread "main" java.lang.ArithmeticException: / by zero
    at aa.BonjourMonde.main(BonjourMonde.java:19)
    Java Result: 1
    Mon souci est que j'aimerai savoir dans quelle Classe se trouve le message d'erreur que je reçois. parce que quand j'ouvre la Class ArithmeticException, il n y a aucun message de ce type dans le code.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /*
     * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved.
     * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
     *
     *
     */
     
    package java.lang;
     
    /**
     * Thrown when an exceptional arithmetic condition has occurred. For
     * example, an integer "divide by zero" throws an
     * instance of this class.
     *
     * {@code ArithmeticException} objects may be constructed by the
     * virtual machine as if {@linkplain Throwable#Throwable(String,
     * Throwable, boolean, boolean) suppression were disabled and/or the
     * stack trace was not writable}.
     *
     * @author  unascribed
     * @since   JDK1.0
     */
    public class ArithmeticException extends RuntimeException {
        private static final long serialVersionUID = 2256477558314496007L;
     
        /**
         * Constructs an {@code ArithmeticException} with no detail
         * message.
         */
        public ArithmeticException() {
            super();
        }
     
        /**
         * Constructs an {@code ArithmeticException} with the specified
         * detail message.
         *
         * @param   s   the detail message.
         */
        public ArithmeticException(String s) {
            super(s);
        }
    }
    J'aimerai aussi savoir où se trouve le code du traitement de la division par zéro dans la Class ArithmeticException.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    La division par zéro, c'est le processeur virtuel qui gère ça et qui lance l'exception. De la même manière qu'un processeur physique va déclencher une interruption. L'exception, comme toutes les exceptions, ne fait aucun traitement. C'est juste un marqueur qui remonte la stack jusqu'au premier catch valable.

    Si tu veux voir où est définie cette exception, jette un oeil ici

    https://github.com/dmlloyd/openjdk/b...rator.cpp#L193

  3. #3
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Ok je vois d'où provient le message, mais j'ai d'autres questions.

    1. Je vois qu'il s'agit d'un fichier nommé "templateInterpreterGenerator.cpp". Est-ce un fichier c++ ?
    2. Si oui quel est le rapport entre java, le c++, et le processeur virtuel?
    3. Où se trouve en réalité ce fichier? Parce que je vois le chemin: openjdk/src/hotspot/share/interpreter/templateInterpreterGenerator.cpp
    4. Y'a t il un cours qui permet de savoir ce qui se passe réellement derrière les rideaux? Parce que dans le fichier je vois d'où provient le message de la division par zéro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Interpreter::_throw_ArithmeticException_entry = generate_exception_handler("java/lang/ArithmeticException" , "/ by zero");
    Mais je ne vois toujours pas où se trouve le traitement?

    Merci

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par momjunior Voir le message
    Ok je vois d'où provient le message, mais j'ai d'autres questions.

    1. Je vois qu'il s'agit d'un fichier nommé "templateInterpreterGenerator.cpp". Est-ce un fichier c++ ?
    A vu de pifomètre je dirais oui. Mais vu son nom, ça ne m'étonnerais pas que ce soit un fichier pour générer un autre code source lui même compilé dans la jvm
    Citation Envoyé par momjunior Voir le message
    2. Si oui quel est le rapport entre java, le c++, et le processeur virtuel?
    Java est un langage (voir les spécifications https://docs.oracle.com/javase/specs...tml/index.html) et toute une série d'apis (voir https://docs.oracle.com/javase/8/docs/api/) qui vont permettre de définir un programme (ce que tu tapes) qui sera ensuite compilé pour être exécuté. C'est tous le monde du programmeur java en gros et c'est déjà énormément à apprendre.

    Viens ensuite la machine java qui va exécuter le programme. C'est un processeur, avec des registres, un language de bytecode, de l'adressage mémoire, des interactions IOs, etc. Un peu comme ton PC. Cette machine est définie par toute une série de spécifications (https://docs.oracle.com/javase/specs...tml/index.html). Seulement comme tout le monde a chez lui des CPUs X86_64 ou des ARMs ou des power pc ou autres, mais que personne ne fabrique des CPUs "java machine" et que de toutes façons se serait pas pratique d'avoir 36 PCs chez soi, viens la JVM. C'est une implémentation de la spécification dans une machine virtuelle. C'est elle qui fera tourner ton programme, qui gèrera sa mémoire et ses liens avec les monde extérieur (système de fichier, réseau, registres, threads, ...)

    Le language et les APIs, c'est ce que tu va toucher en tant que développeur
    La machine virtuelle, c'est juste un outil (java.exe) que tu lancera sans avoir besoin de regarder sous le capot comment c'est fait. D'ailleurs il existe de multiples implémentation de la JVM: https://fr.wikipedia.org/wiki/Liste_...irtuelles_Java

    C'est vraiment deux mondes différents. Le premier c'est celui que tu va toucher à priori. Le deuxième c'est à la limite un monde où on ne fait pas de java, on fait une machine virtuelle, écrite en c, c++ et assembleur. Cette machine ne connait rien au language, elle ne connait que le bytecode.

    Citation Envoyé par momjunior Voir le message
    3. Où se trouve en réalité ce fichier? Parce que je vois le chemin: openjdk/src/hotspot/share/interpreter/templateInterpreterGenerator.cpp
    En l'occurence, celui que je t'ai filé correspond à la java 10 en cours de développement si j'en juge par ce que me dit github. Les sources de VM openjdk sont ici http://hg.openjdk.java.net.

    Citation Envoyé par momjunior Voir le message
    4. Y'a t il un cours qui permet de savoir ce qui se passe réellement derrière les rideaux? Parce que dans le fichier je vois d'où provient le message de la division par zéro:
    A priori seul les gens développant la JVM savent vraiment ce qui se passe à ce niveau là je dirais Il y a pas mal de documents techniques (white papers) sur le site d'oracle autour de java qui expliquent comment leur jvm traite l'un ou l'autre truc et en quoi ça implique l'utilisateur.

    https://docs.oracle.com/javase/9/vm/...1-CB6475019281

    Citation Envoyé par momjunior Voir le message
    Mais je ne vois toujours pas où se trouve le traitement?
    Ben au final, la division entière, c'est calculé directement par ton processeur physique: on tape le numérateur et le dénominateur dans deux registre du CPU, on lance une instruction DIV et voilà. Et c'est le CPU au niveau de son cablage hardware qui en cas de division par zéro lance une interruption. Celle-ci est attrapée par l'OS (linux / windows / ...) et comme le process "java" a branché un trap sur cette interruption, il reçoit cette interruption et la transforme en un exception. En gros y a un table qui est définie à la volée dans la JVM et qui mappe les interruptions sur des exceptions java. En gros. Pour plus de détail, sortir un cours sur l'architecture des ordinateurs et des système d'exploitation :p

  5. #5
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Ok je comprends.

    Concernant la JVM, lorsque j'installe le JDK ou le JRE, comment savoir la version de la JVM que je suis en train d'installer? Et est ce important de le savoir?
    Parce que j'ai vu qu'il y'a plusieurs versions:

    https://fr.wikipedia.org/wiki/Liste_...irtuelles_Java

    Et pour finir, ai-je besoin d'avoir des notions sur la JVM et sur ce qui se passe derrière les rideaux pour devenir un bon programmeur java, ou bien je peux me limiter seulement au "premier monde" comme tu l'as dit.

    Merci

  6. #6
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Citation Envoyé par momjunior Voir le message
    Concernant la JVM, lorsque j'installe le JDK ou le JRE, comment savoir la version de la JVM que je suis en train d'installer? Et est ce important de le savoir?
    Parce que j'ai vu qu'il y'a plusieurs versions:

    https://fr.wikipedia.org/wiki/Liste_...irtuelles_Java
    Si tu récupères ton JDK depuis le site Oracle, tu utilises donc très certainement la JVM HotSpot. Tu peux lire cette actualité de 2017 qui t'éclairera un peu plus sur tout cela : https://www.developpez.com/actu/1609...ation-Eclipse/

    Si tu voulais utiliser la JVM J9, tu aurais alors téléchargé ton JDK depuis le site d'IBM par exemple.

    Citation Envoyé par momjunior Voir le message
    Et pour finir, ai-je besoin d'avoir des notions sur la JVM et sur ce qui se passe derrière les rideaux pour devenir un bon programmeur java, ou bien je peux me limiter seulement au "premier monde" comme tu l'as dit.
    Tu peux te limiter au premier monde. Je ne sais pas ton expérience ou ton poste mais là on touche à des choses que la plupart des développeurs Java n'ont pas besoin de savoir. L'utilisation d'une JVM ou une autre peut induire certaines subtilités. Mais franchement, ce n'est pas des choses dont tu dois te soucier pour faire du bon code Java (tout du moins pas tout de suite et pendant un bon moment encore). Pour information, il y a un tutoriel qui parle ici des particularités d'une autre JVM que la classique HotSpot, la J9 d'IBM : https://arodrigues.developpez.com/tu...nt-jvm-ibm-j9/
    On y voit là qu'on touche à des mécanismes de gestion mémoire qui divergent.

    Je me demande donc le pourquoi de ces questions au premier abord. car là c'est vraiment très technique et subtile pour le commun des développeurs Java.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  7. #7
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Le pourquoi de ces questions provient du fait que je me demandais juste d'où provenait le message d'erreur de la division par 0.

    Bref toutes ces réponses me rassurent un peu, car je pensais que le fait de ne pas connaitre ce qui se passait derrière les rideaux était un faux départ dans l'apprentissage de Java. Pour l'instant je vais donc me limiter à l'essentiel.

    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bug de code dont je ne trouve pas la source
    Par Dunkhan dans le forum Débuter
    Réponses: 15
    Dernier message: 14/06/2017, 13h25
  2. Code sources offerts ou vendus par MS
    Par zulad dans le forum Général Dotnet
    Réponses: 8
    Dernier message: 13/08/2013, 15h21
  3. [Free Pascal] [2.4.3] Où se trouve le code de la fonction int dans les sources
    Par Invité dans le forum Free Pascal
    Réponses: 5
    Dernier message: 08/11/2010, 18h50
  4. Réponses: 8
    Dernier message: 02/06/2007, 20h08
  5. [VB6] Code source pour modifier MsgBox
    Par khany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 25/02/2003, 15h13

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