Seperti yang telah dijawab , dimungkinkan untuk mengeksekusi kode, dan khususnya untuk memanggil fungsi, setelah menangkap a StackOverflowErrorkarena prosedur penanganan pengecualian normal dari JVM melepaskan tumpukan antara titik throwdan catchtitik, membebaskan ruang tumpukan untuk Anda gunakan. Dan percobaan Anda menegaskan bahwa itu masalahnya.
Namun, itu tidak sama dengan mengatakan bahwa secara umum dimungkinkan untuk pulih dari a StackOverflowError.
A StackOverflowErrorIS-A VirtualMachineError, yaitu IS-AN Error. Seperti yang Anda tunjukkan, Java memberikan beberapa saran samar untuk Error:
menunjukkan masalah serius yang seharusnya tidak ditangani oleh aplikasi yang wajar
dan Anda, cukup, menyimpulkan bahwa harus terdengar seperti penangkapan Errormungkin OK dalam beberapa keadaan. Perhatikan bahwa melakukan satu eksperimen tidak menunjukkan bahwa ada sesuatu yang secara umum aman untuk dilakukan. Hanya aturan bahasa Java dan spesifikasi kelas yang Anda gunakan yang dapat melakukannya. A VirtualMachineErroradalah kelas pengecualian khusus, karena Spesifikasi Bahasa Java dan Spesifikasi Mesin Virtual Java memberikan informasi tentang semantik pengecualian ini. Secara khusus, yang terakhir mengatakan :
Implementasi Java Virtual Machine melontarkan objek yang merupakan turunan dari subkelas kelas VirtualMethodErrorsaat kesalahan internal atau batasan sumber daya mencegahnya untuk mengimplementasikan semantik yang dijelaskan dalam bab ini. Spesifikasi ini tidak dapat memprediksi di mana kesalahan internal atau keterbatasan sumber daya dapat ditemukan dan tidak mewajibkan secara tepat kapan kesalahan tersebut dapat dilaporkan. Dengan demikian, salah satu VirtualMethodErrorsubclass yang ditentukan di bawah ini dapat dilemparkan kapan saja selama pengoperasian Mesin Virtual Java:
...
StackOverflowError: Implementasi Java Virtual Machine telah kehabisan ruang tumpukan untuk sebuah utas, biasanya karena utas melakukan pemanggilan rekursif dalam jumlah tak terbatas sebagai akibat dari kesalahan dalam program yang sedang dijalankan.
Masalah krusialnya adalah Anda "tidak bisa memprediksi" di mana atau kapan surat StackOverflowErrorwasiat akan dilemparkan. Tidak ada jaminan di mana tidak akan dilempar. Anda tidak dapat mengandalkannya untuk dilemparkan saat masuk ke metode, misalnya. Itu bisa dilemparkan pada suatu titik dalam suatu metode.
Ketidakpastian ini berpotensi menjadi bencana. Karena dapat dilemparkan di dalam metode, ia dapat dilemparkan sebagian melalui urutan operasi yang dianggap kelas sebagai satu operasi "atom", meninggalkan objek dalam keadaan yang dimodifikasi sebagian, tidak konsisten. Dengan objek dalam keadaan tidak konsisten, upaya apa pun untuk menggunakan objek tersebut dapat mengakibatkan perilaku yang salah. Dalam semua kasus praktis, Anda tidak dapat mengetahui objek mana yang berada dalam kondisi tidak konsisten, jadi Anda harus berasumsi bahwa tidak ada objek yang dapat dipercaya. Setiap operasi pemulihan atau upaya untuk melanjutkan setelah pengecualian tertangkap karena itu bisa memiliki perilaku yang keliru. Oleh karena itu, satu-satunya hal yang aman untuk dilakukan adalah tidak menangkap aStackOverflowError, melainkan untuk mengizinkan program dihentikan. (Dalam praktiknya Anda mungkin mencoba melakukan beberapa pencatatan kesalahan untuk membantu pemecahan masalah, tetapi Anda tidak dapat mengandalkan pencatatan itu beroperasi dengan benar). Artinya, Anda tidak dapat memulihkan secara andal dari aStackOverflowError .