Je suis venu ici parce que j'ai aussi rencontré cette question dans The Passionate Programmer , de Chad Fowler. Pour ceux qui n'ont pas accès à une copie, la question est formulée comme une sorte de filtre / test pour les candidats en entrevue pour un poste nécessitant de «très bons programmeurs Java».
Plus précisément, il demande:
Comment écririez-vous un programme, en Java pur, qui ferait planter la machine virtuelle Java?
J'ai programmé en Java pendant plus de 15 ans et j'ai trouvé cette question à la fois déroutante et injuste. Comme d'autres l'ont souligné, Java, en tant que langage géré, est spécifiquement conçu pour ne pas planter . Bien sûr, il y a toujours des bogues JVM, mais:
- Après plus de 15 ans de JRE de niveau production, c'est rare.
- De tels bogues sont susceptibles d'être corrigés dans la prochaine version, alors quelle est la probabilité que vous, en tant que programmeur, rencontriez et rappeliez les détails de l'ensemble actuel de show-stoppers JRE?
Comme d'autres l'ont mentionné, du code natif via JNI est un moyen sûr de planter un JRE. Mais l'auteur a spécifiquement mentionné en Java pur , donc c'est fini.
Une autre option consisterait à alimenter les faux codes d'octets JRE; il est assez facile de vider des données binaires inutiles dans un fichier .class et de demander au JRE de l'exécuter:
$ echo 'crap crap crap' > crap.class
$ java crap
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1668440432 in class file crap
Cela compte-t-il? Je veux dire que le JRE lui-même ne s'est pas écrasé; il a correctement détecté le faux code, l'a signalé et est sorti.
Cela nous laisse avec les types de solutions les plus évidents tels que le gonflement de la pile via la récursivité, le manque de mémoire du tas via des allocations d'objets ou simplement le lancement RuntimeException
. Mais cela provoque simplement la fermeture du JRE avec une StackOverflowError
exception ou une exception similaire, ce qui, encore une fois, n'est pas vraiment un crash .
Alors que reste-t-il? J'adorerais vraiment entendre ce que l'auteur avait vraiment en tête comme solution appropriée.
Mise à jour : Chad Fowler a répondu ici .
PS: c'est un livre autrement génial. Je l'ai pris pour un soutien moral tout en apprenant Ruby.