15 EYLÜL 2012, CUMARTESİ
try-finally blok StackOverflowError engeller
Aşağıdaki iki yöntemden bir göz atın:
public static void foo() {
try {
foo();
} finally {
foo();
}
}
public static void bar() {
bar();
}
bar()
açıkça* *4, ama bir koşu sonuçları çalışan foo()
(program süresiz olarak çalıştırmak gibi görünüyor) değil.Bu yüzden mi?
CEVAP
15 EYLÜL 2012, CUMARTESİ
Sonsuza kadar çalışmaz. Her taşması kod sonunda blok taşımak için olur yığını. Sorun, gerçekten çok uzun zaman alacak olmasıdır. Zaman sırasını N maksimum derinlik yığını nerede O(2^N).
5 maksimum derinliği düşünün
foo() calls
foo() calls
foo() calls
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally calls
foo() calls
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally calls
foo() calls
foo() calls
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally calls
foo() calls
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
finally
foo() calls
foo() which fails to call foo()
finally calls
foo() which fails to call foo()
Çalışma sonunda bloğuna her seviyede iki kat daha uzun derinliği olabilir bir yığın al 10.000 veya daha fazla. Eğer 10,000,000 saniyede görüşme yapabilirsiniz, bu 10^3003 evrenin yaşı daha saniye veya daha uzun sürer.
Bunu Paylaş:
Neden kullan try {} finally {} boş den...
Ekle&; style= " display:"blok&quo...
Yumurtlama blok düzeyi öğeler içinde &...
Objective-C blok özellikleri olarak ku...
Yok'ınternet explorer içinde çalı...