Je suis venu ici car j'ai également rencontré cette question dans The Passionate Programmer, de Chad Fowler. Pour ceux qui n'ont pas accès à une copie, la question est posée comme un genre de filtre/test pour les candidats passant un entretien pour un poste nécessitant des "vraiment bons programmeurs Java".
Plus précisément, il demande :
Comment écririez-vous un programme, en pur Java, 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éconcertante 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 bugs JVM, mais :
- Après plus de 15 ans de JRE en production, c'est rare.
- Tous ces bugs sont susceptibles d'être corrigés dans la prochaine version, alors quelle est la probabilité, pour vous en tant que programmeur, de rencontrer et de vous rappeler les détails des problèmes actuels du JRE ?
Comme d'autres l'ont mentionné, du code natif via JNI est un moyen sûr de faire planter un JRE. Mais l'auteur a spécifiquement mentionné en pur Java, donc c'est exclu.
Une autre option serait de nourrir au JRE des octets bidons ; il est assez simple de déverser des données binaires corrompues dans un fichier .class, et de demander au JRE de l'exécuter :
$ echo 'bidon bidon bidon' > bidon.class
$ java bidon
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1668440432 in class file bidon
Est-ce que cela compte ? Je veux dire que le JRE lui-même n'a pas planté ; il a correctement détecté le code bidon, l'a signalé et s'est arrêté.
Cela nous laisse avec les types de solutions les plus évidents tels que faire planter la pile via la récursion, épuiser la mémoire heap via les allocations d'objets, ou simplement lancer RuntimeException
. Mais cela fait juste sortir le JRE avec une StackOverflowError
ou une exception similaire, ce qui, encore une fois n'est pas vraiment un crash.
Alors que reste-t-il ? J'aimerais vraiment entendre ce que l'auteur avait vraiment en tête comme solution correcte.
Mise à jour : Chad Fowler a répondu ici.
PS : c'est par ailleurs un excellent livre. Je l'ai pris pour me soutenir moralement en apprenant Ruby.
1 votes
Possible superset de : stackoverflow.com/questions/6470651/…
0 votes
stackoverflow.com/questions/30072883/… "Si j'utilise JDK1.8_40 ou plus récent (Oracle ou OpenJDK font la même chose), le code suivant avec un redimensionnement de la boîte de dialogue fera planter l'application (essayé sous Windows 7, x64, JDK 64 bits)" - Le code ne fait que 40 lignes, et il provoque un plantage réel du JVM.