PHP interperts le code, ce qui signifie qu'il s'exécute sur la source chaque fois que vous exécutez le programme. Cela a l'avantage de sauter lorsque le code est lu (ce qui rend les impressions de numéros de ligne triviales); Cependant, il est souvent coûteux d'une autre manière, car vous ne pouvez pas optimiser en profondeur (ou effectuer une vérification d'erreur avant l'exécution).
Java compiles its code into a JVM assembly language called "bytecode." Cela signifie que ce qui est en cours d'exécution n'a généralement pas accès au code source (ni même son utilisation). Cela dit, il y a des techniques. Une classe Java compilée a la possibilité d'ajouter des "données supplémentaires" et l'un de ces "éléments de données supplémentaires" est a line number table, qui est un index permettant à quelqu'un exécutant l'assembly de "rechercher" le numéro de ligne comme le compilateur l'a enregistré. Cela fonctionne généralement bien, avec les considérations suivantes: les compilateurs ne marquent souvent pas toutes les instructions, le code source peut ne pas être disponible, l'optimisation peut empêcher certains codes internes de fonctionner de manière à faciliter le pointage vers l'entrée texte de code. Comment les outils de couverture de code "fixent" ceci est qu'ils insèrent généralement dans le code (au niveau de l'assemblage) un grand nombre de commandes qui agissent comme des instructions de journalisation dans un format qui permet à l'outil de déterminer le chemin à travers le le code a été effectivement suivi. Il est ensuite recopié le mieux possible dans la table des numéros de ligne, puis utilisé pour mettre en surbrillance les lignes dans le fichier source d'origine.
Si vous voulez quelque chose avec une résolution plus fine (quelque chose qui peut traiter quelle partie d'une ligne a été exécutée) alors vous devez creuser plus profondément. Finalement, vous pourriez même envisager d'écrire votre propre compilateur (ou extension de compilateur) qui stockera votre propre table de numéro de ligne personnalisée qui surmonte les lacunes des solutions actuelles.
Des trucs comme jeter des exceptions (comme Shiven l'a mentionné) et analyser le numéro de ligne fonctionnent; cependant, ils polluent votre code avec un traitement d'exception impair pour les éléments qui ne sont vraiment ne sont pas exceptionnel, juste pour "obtenir le numéro de ligne". En raison de l'encombrement du code et des performances d'exécution généralement moins bonnes des exceptions, j'ai tendance à éviter de telles solutions (mais elles fonctionnent).
Quoi qu'il en soit, j'espère que cela vous donnera une idée de pourquoi cela ne fonctionne pas toujours exactement de la même manière que PHP.
Si vous voulez vraiment vous amuser avec les numéros de ligne _without_ throwing exceptions, vous pouvez écrire votre propre 'ClassLoader' qui serait capable de vous fournir une facilité pour obtenir la table de numéros de ligne; Cependant, vous devrez peut-être écrire votre propre extension dans Thread pour avoir une interface utilisable avec l'instruction bytecode actuelle de la JVM. C'est faisable, comme le lancer d'exception le fait pour vous déjà, mais c'est beaucoup de travail pour quelque chose qui est généralement inutile avec une journalisation différemment structurée. –
Merci pour ça! Je comprends la différence entre les langages compilés et interprétés et je sais que l'obtention des numéros de ligne pour Java exécuté (ou n'importe quel langage compilé) n'est pas vraiment trivial. J'ai décidé d'aller avec Cobertura pour générer le rapport. Je n'ai jamais utilisé un outil de couverture de code auparavant, donc ça va me prendre un peu de temps pour comprendre. Voir le commentaire ci-dessous ce post. De l'aide serait grandement appréciée. Merci beaucoup! – DanB91