SORU
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ş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • iMasterful

    iMasterful

    11 EYLÜL 2009
  • Samvith V Rao

    Samvith V Ra

    20 EKİM 2006
  • wwjoshdo

    wwjoshdo

    25 Mayıs 2009