ในความพยายามที่จะให้หลักฐานที่สมเหตุสมผลว่าในที่สุด WILL นี้จะยุติฉันขอเสนอรหัสที่ไม่มีความหมายต่อไปนี้ หมายเหตุ: Java ไม่ใช่ภาษาของฉันด้วยจินตนาการที่สดใสที่สุด ผมเสนอนี้ขึ้นเพื่อสนับสนุนคำตอบของปีเตอร์ซึ่งเป็นตอบที่ถูกต้องกับคำถาม
ความพยายามที่จะจำลองเงื่อนไขของสิ่งที่เกิดขึ้นเมื่อการเรียกไม่สามารถเกิดขึ้นได้เพราะมันจะแนะนำกองล้น สำหรับฉันแล้วสิ่งที่ยากที่สุดที่ผู้คนไม่สามารถเข้าใจได้ในสิ่งที่การเรียกนั้นไม่เกิดขึ้นเมื่อมันไม่สามารถเกิดขึ้นได้
public class Main
{
public static void main(String[] args)
{
try
{ // invoke foo() with a simulated call depth
Main.foo(1,5);
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
}
public static void foo(int n, int limit) throws Exception
{
try
{ // simulate a depth limited call stack
System.out.println(n + " - Try");
if (n < limit)
foo(n+1,limit);
else
throw new Exception("StackOverflow@try("+n+")");
}
finally
{
System.out.println(n + " - Finally");
if (n < limit)
foo(n+1,limit);
else
throw new Exception("StackOverflow@finally("+n+")");
}
}
}
การส่งออกของกองหนาไม่มีจุดหมายของสารที่หนานี้มีดังต่อไปนี้และข้อยกเว้นที่เกิดขึ้นจริงอาจเป็นเรื่องแปลกใจ โอ้และลองโทร 32 ครั้ง (2 ^ 5) ซึ่งคาดว่าจะสมบูรณ์:
1 - Try
2 - Try
3 - Try
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
3 - Finally
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
2 - Finally
3 - Try
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
3 - Finally
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
1 - Finally
2 - Try
3 - Try
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
3 - Finally
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
2 - Finally
3 - Try
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
3 - Finally
4 - Try
5 - Try
5 - Finally
4 - Finally
5 - Try
5 - Finally
java.lang.Exception: StackOverflow@finally(5)
finally
คำสั่งจะเผยแพร่ไปยังระดับถัดไปขึ้นไป แต่อย่ากลั้นลมหายใจของคุณ จำนวนขั้นตอนที่ดำเนินการจะอยู่ที่ประมาณ 2 ถึง (ความลึกสูงสุดของสแต็ก) และการโยนข้อยกเว้นไม่ได้ราคาถูกเช่นกัน