Seperti yang telah dijawab , dimungkinkan untuk mengeksekusi kode, dan khususnya untuk memanggil fungsi, setelah menangkap a StackOverflowError
karena prosedur penanganan pengecualian normal dari JVM melepaskan tumpukan antara titik throw
dan catch
titik, 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 StackOverflowError
IS-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 Error
mungkin 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 VirtualMachineError
adalah 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 VirtualMethodError
saat 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 VirtualMethodError
subclass 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 StackOverflowError
wasiat 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
.