SORU
19 AĞUSTOS 2013, PAZARTESİ


İçinde sonsuz özyineleme gelen kafa karıştırıcı çıkış try-catch

Aşağıdaki kodu göz önünde bulundurun.

public class Action {
private static int i=1;
public static void main(String[] args) {
    try{
        System.out.println(i);
        i  ;
        main(args);
    }catch (StackOverflowError e){
        System.out.println(i);
        i  ;
        main(args);
    }
 }

}

4338 ben doğru değeri alıyorum. StackOverflowError çıktı aşağıdaki gibi kablolu almak yakalamak sonra.

4336
4337
4338 // up to this point out put can understand 
433943394339 // 4339 repeating thrice  
434043404340
4341
434243424342
434343434343
4344
4345
434643464346
434743474347
4348
434943494349
435043504350

Live burada demo düşünün. Doğru i=4330 kadar çalışıyor. Aslında bu nasıl oldu?

BİLGİNİZE:

Burada neler olduğunu anlamaya kodu aşağıdaki yaptım.

public class Action {

    private static int i = 1;
    private static BufferedWriter bw;

    static {
        try {
            bw = new BufferedWriter(new FileWriter("D:\\sample.txt"));
        } catch (IOException e) {
           e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        bw.append(String.valueOf(i) " ");
        try {
            i  ;
            main(args);
        } catch (StackOverflowError e) {
            bw.append(String.valueOf(i) " ");
            i  ;
            main(args);
        }
    }

}

Şimdi önceki sorun yok. şimdi i değer 16824744 doğru ve daha fazla çalışır. Bu bir sorun olabilir olmadan i=2,147,483,647value(int max değer) kadar çalışır atlamalı ediyorum.

println() ile bazı sorun var. Benzer cevapları da feryat var. Ama neden?

Gerçek nedeni ne olacak?

CEVAP
19 AĞUSTOS 2013, PAZARTESİ


433943394339 yeni satır karakter olmadığını unutmayın. Yanlış bir şey System.out.println() içinde gerçekleştiğini gösterir.

Asıl önemli nokta burada System.out.println() StackOverflowError System.out.println() atılır, böylece çalışmak için yığın alanı gerektirir.

Burada noktalar ile: kodunuzu

public static void main(String[] args) {
    try{
        System.out.println(i); // (1)
        i  ;
        main(args); // (2)
    }catch (StackOverflowError e){
        System.out.println(i); // (3)
        i  ;
        main(args); // (4)
    }
}

Düzeyinde ben ne zaman özyineleme N = 4338: ne olacağını düşünelim

  • Düzeyi N ifadesi (1) 4338 yazdırır.Çıkış 4338\n
  • i 4339 artırılır
  • Kontrol akış (2) Seviye N 1 girer
  • Düzeyinde deyimi (1) N 1 4339 ama System.out.println() bir yeni satır yazdırır önce StackOverflowError bir atar yazdırmak için çalışır.Çıkış 4339
  • StackOverflowError 1, açıklama (3) Baskı 4339 çalışır N düzeyde yakalandı ve aynı sebepten dolayı yine başarısız.Çıkış 4339
  • Özel durum açıklama (3) 32 ** yazdırma için çalışır daha fazla yer yığın, bu nedenle başarılı olduğunu ve bu nokta (yeni satır doğru yazdırıldı) düzeyinde N. yakalandı.Çıkış 4339\n
  • i artırılır ve kontrol akış seviyesi N 1 Tekrar (4) girer

Bu noktadan sonra durumu 4340 ile tekrarlar.

Bazı sayılar correclty yeni satır, belki de System.out.println() ilgili iç çalışmalarını ve kullandığı tamponlar olmadan dizileri arasında yazdırılır neden emin değilim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Engadget

    Engadget

    18 EYLÜL 2006
  • George McCarron

    George McCar

    29 Mayıs 2013
  • khloe brooks

    khloe brooks

    25 Temmuz 2011