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

  • echifitness

    echifitness

    9 Kasım 2008
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007
  • THE RED DRAGON

    THE RED DRAG

    6 ŞUBAT 2009