Ich bin hierher gekommen, weil ich in The Passionate Programmer auch auf diese Frage gestoßen bin von Chad Fowler . Für diejenigen, die keinen Zugriff auf eine Kopie haben, ist die Frage als eine Art Filter / Test für Kandidaten gedacht, die sich für eine Position bewerben, die "wirklich gute Java-Programmierer" erfordert.
Insbesondere fragt er:
Wie würden Sie ein Programm in reinem Java schreiben, das zum Absturz der Java Virtual Machine führen würde?
Ich habe über 15 Jahre in Java programmiert und fand diese Frage sowohl rätselhaft als auch unfair. Wie andere bereits betont haben, wurde Java als verwaltete Sprache speziell entwickelt, um nicht zum Absturz zu kommen . Natürlich gibt es immer JVM-Fehler, aber:
- Nach mehr als 15 Jahren JREs auf Produktionsebene ist dies selten.
- Solche Fehler werden wahrscheinlich in der nächsten Version behoben. Wie wahrscheinlich ist es also, dass Sie als Programmierer auf die Details der aktuellen JRE-Show-Stopper stoßen und diese abrufen?
Wie andere bereits erwähnt haben, ist nativer Code über JNI ein sicherer Weg, um eine JRE zum Absturz zu bringen. Aber der Autor hat speziell in reinem Java erwähnt , das ist also raus.
Eine andere Möglichkeit wäre, die JRE-Scheinbytecodes einzugeben. Es ist einfach genug, einige Müll-Binärdaten in eine .class-Datei zu kopieren und die JRE zu bitten, sie auszuführen:
$ echo 'crap crap crap' > crap.class
$ java crap
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 1668440432 in class file crap
Zählt das? Ich meine, die JRE selbst ist nicht abgestürzt. Der falsche Code wurde ordnungsgemäß erkannt, gemeldet und beendet.
Dies lässt uns die naheliegendsten Arten von Lösungen übrig, z. B. das Aufblasen des Stapels durch Rekursion, das Auslaufen des Heapspeichers durch Objektzuweisungen oder das einfache Werfen RuntimeException. Dies führt jedoch nur dazu, dass die JRE mit einer StackOverflowErroroder einer ähnlichen Ausnahme beendet wird, was wiederum kein wirklicher Absturz ist .
Also, was ist noch übrig? Ich würde wirklich gerne hören, was der Autor wirklich als richtige Lösung im Sinn hatte.
Update : Chad Fowler hat hier geantwortet .
PS: Es ist ein ansonsten tolles Buch. Ich nahm es zur moralischen Unterstützung auf, als ich Ruby lernte.