Daha önce cevaplandığı gibi , bir yakaladıktan sonra kod çalıştırmak ve özellikle fonksiyonları çağırmak mümkündür, StackOverflowError
çünkü JVM'nin normal istisna işleme prosedürü, yığın alanını kullanmak için serbest bırakarak throw
, catch
noktalar ve noktalar arasındaki yığını çözer . Ve deneyiniz durumun böyle olduğunu doğruluyor.
Ancak, bu kadar karşı, genel olarak, mümkün olduğu şeklindeki oldukça aynı değildir kurtarmak bir mesafede StackOverflowError
.
BİR StackOverflowError
IS-A VirtualMachineError
, ki bu AN Error
. Sizin de belirttiğiniz gibi, Java şu konularda bazı belirsiz tavsiyeler verir Error
:
makul bir uygulamanın yakalamaya çalışmaması gereken ciddi sorunları belirtir
ve makul bir şekilde, bunun bazı durumlarda iyi olabileceği gibi görünmesi gerektiği sonucuna Error
varıyorsunuz. Bir deney yapmanın, genellikle bir şeyin yapılmasının güvenli olduğunu göstermediğini unutmayın. Bunu yalnızca Java dilinin kuralları ve kullandığınız sınıfların özellikleri yapabilir. A VirtualMachineError
, özel bir istisna sınıfıdır, çünkü Java Dil Spesifikasyonu ve Java Sanal Makine Spesifikasyonu bu istisnanın anlambilimiyle ilgili bilgi sağlar. Özellikle, ikincisi şöyle diyor :
Bir Java Sanal Makinesi uygulaması VirtualMethodError
, bir iç hata veya kaynak sınırlaması, bu bölümde açıklanan semantiği uygulamasını engellediğinde , sınıfın bir alt sınıfının bir örneği olan bir nesneyi atar . Bu belirtim, dahili hataların veya kaynak sınırlamalarının nerede karşılaşılabileceğini tahmin edemez ve tam olarak ne zaman rapor edilebileceklerini belirlemez. Bu nedenle, VirtualMethodError
aşağıda tanımlanan alt sınıflardan herhangi biri, Java Sanal Makinesi'nin çalışması sırasında herhangi bir zamanda atılabilir:
...
StackOverflowError
: Java Sanal Makinesi uygulamasında, bir iş parçacığı için yığın alanı tükendi, bunun nedeni tipik olarak iş parçacığının, çalıştırılan programdaki bir hatanın bir sonucu olarak sınırsız sayıda özyinelemeli çağrı yapmasıdır.
Can alıcı sorun, a'nın nereye veya ne zaman StackOverflowError
atılacağını "tahmin edememenizdir" . Nereye atılmayacağına dair hiçbir garanti yok . Örneğin, bir yönteme girişte atılacağına güvenemezsiniz . Bir yöntem içinde bir noktaya fırlatılabilir .
Bu öngörülemezlik potansiyel olarak felakettir. Bir yöntemin içine atılabileceği için, sınıfın tek bir "atomik" işlem olarak gördüğü bir işlem dizisi boyunca kısmen atılabilir ve nesneyi kısmen değiştirilmiş, tutarsız bir durumda bırakabilir. Nesne tutarsız bir durumdayken, o nesneyi kullanmaya yönelik herhangi bir girişim hatalı davranışa neden olabilir. Tüm pratik durumlarda, hangi nesnenin tutarsız durumda olduğunu bilemezsiniz , bu nedenle hiçbir nesnenin güvenilir olmadığını varsaymanız gerekir . Herhangi bir kurtarma işlemi veya istisna yakalandıktan sonra devam etme girişimi bu nedenle hatalı davranışlara neden olabilir. Yapılacak tek güvenli şey etmektir değil bir yakalamakStackOverflowError
bunun yerine programın sonlandırılmasına izin vermek için. (Pratikte, sorun gidermeye yardımcı olmak için bazı hata günlüğü oluşturma girişiminde bulunabilirsiniz, ancak bu günlük kaydının düzgün çalışmasına güvenemezsiniz ). Yani, güvenilir bir şekilde birStackOverflowError
.