ตามที่ได้รับคำตอบไปแล้วมันเป็นไปได้ที่จะรันโค้ดและโดยเฉพาะอย่างยิ่งในการเรียกใช้ฟังก์ชันหลังจากที่จับได้StackOverflowError
เนื่องจากขั้นตอนการจัดการข้อยกเว้นตามปกติของ JVM จะคลายสแต็กระหว่างจุดthrow
และcatch
จุดโดยเพิ่มพื้นที่สแต็กเพื่อให้คุณใช้งานได้ และการทดสอบของคุณยืนยันว่าเป็นเช่นนั้น
อย่างไรก็ตามนั่นไม่เหมือนกับการบอกว่าโดยทั่วไปแล้วเป็นไปได้ที่จะกู้คืนจากไฟล์StackOverflowError
.
StackOverflowError
IS-A ซึ่งเป็น-AnVirtualMachineError
Error
ดังที่คุณชี้ให้เห็น Java ให้คำแนะนำที่คลุมเครือสำหรับError
:
แสดงถึงปัญหาร้ายแรงที่ไม่ควรพยายามจับแอปพลิเคชันที่สมเหตุสมผล
และคุณมีเหตุผลสรุปได้ว่าควรจะดูเหมือนการจับError
ได้ในบางสถานการณ์ โปรดทราบว่าการทำการทดลองหนึ่งครั้งไม่ได้แสดงให้เห็นว่าโดยทั่วไปมีความปลอดภัยที่จะทำ เฉพาะกฎของภาษา Java และข้อกำหนดของคลาสที่คุณใช้เท่านั้นที่ทำได้ A VirtualMachineError
เป็นคลาสพิเศษของข้อยกเว้นเนื่องจากJava Language SpecificationและJava Virtual Machine Specificationให้ข้อมูลเกี่ยวกับความหมายของข้อยกเว้นนี้ โดยเฉพาะอย่างยิ่งหลังพูดว่า :
การใช้งาน Java Virtual Machine จะพ่นอ็อบเจ็กต์ที่เป็นอินสแตนซ์ของคลาสย่อยของคลาสVirtualMethodError
เมื่อข้อผิดพลาดภายในหรือข้อ จำกัด ของทรัพยากรป้องกันไม่ให้นำความหมายที่อธิบายไว้ในบทนี้ไปใช้ ข้อกำหนดนี้ไม่สามารถคาดเดาได้ว่าอาจพบข้อผิดพลาดภายในหรือข้อ จำกัด ของทรัพยากรและไม่ได้รับคำสั่งอย่างแม่นยำเมื่อสามารถรายงานได้ ดังนั้นVirtualMethodError
คลาสย่อยใด ๆ ที่กำหนดไว้ด้านล่างนี้อาจถูกโยนทิ้งได้ตลอดเวลาระหว่างการทำงานของ Java Virtual Machine:
...
StackOverflowError
: การใช้งาน Java Virtual Machine ไม่มีพื้นที่สแต็กสำหรับเธรดโดยทั่วไปเนื่องจากเธรดกำลังดำเนินการเรียกใช้ซ้ำจำนวนที่ไม่ถูกผูกไว้อันเป็นผลมาจากข้อบกพร่องในโปรแกรมที่เรียกใช้งาน
ปัญหาที่สำคัญคือคุณ "ไม่สามารถคาดเดา" ได้ว่าStackOverflowError
จะโยนไปที่ใดหรือเมื่อใด มีการค้ำประกันไม่เกี่ยวกับการที่จะไม่ถูกโยน คุณไม่สามารถวางใจได้ว่ามันถูกโยนเข้าสู่เมธอดตัวอย่างเช่น มันอาจถูกโยนไปที่จุดหนึ่งภายในวิธีการ
ความไม่สามารถคาดเดาได้นี้อาจเป็นหายนะ เนื่องจากสามารถโยนลงในวิธีการหนึ่งมันอาจถูกโยนบางส่วนผ่านลำดับของการดำเนินการที่คลาสถือว่าเป็นการดำเนินการแบบ "อะตอม" โดยปล่อยให้อ็อบเจ็กต์อยู่ในสถานะที่แก้ไขบางส่วนไม่สอดคล้องกัน เมื่อวัตถุอยู่ในสถานะที่ไม่สอดคล้องกันความพยายามใด ๆที่จะใช้วัตถุนั้นอาจส่งผลให้เกิดพฤติกรรมที่ผิดพลาด ในกรณีที่การปฏิบัติทั้งหมดที่คุณไม่สามารถรู้ซึ่งวัตถุอยู่ในสถานะที่ไม่สอดคล้องกันดังนั้นคุณต้องคิดว่าไม่มีวัตถุเป็นที่น่าเชื่อถือ ใด ๆ ที่ดำเนินการกู้คืนหรือความพยายามที่จะดำเนินการต่อหลังจากข้อยกเว้นที่ถูกจับได้จึงอาจมีลักษณะการทำงานที่ผิดพลาด สิ่งเดียวที่ปลอดภัยที่ต้องทำคืออย่าจับไฟล์StackOverflowError
แต่เป็นการอนุญาตให้โปรแกรมยุติ (ในทางปฏิบัติคุณอาจพยายามบันทึกข้อผิดพลาดบางอย่างเพื่อช่วยในการแก้ไขปัญหา แต่คุณไม่สามารถพึ่งพาการบันทึกนั้นได้อย่างถูกต้อง) นั่นคือคุณไม่สามารถกู้คืนไฟล์StackOverflowError
.