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

  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • RaverX DouBle StAg XI

    RaverX DouBl

    23 Mayıs 2008
  • TSE

    TSE

    12 Kasım 2012