SORU
20 Aralık 2011, Salı


Java ile sonsuz döngü

Java while aşağıdaki sonsuz bir döngüye bak. Aşağıda deyimi için bir derleme zamanı hatası neden olur.

while(true) {
    System.out.println("inside while");
}

System.out.println("while terminated"); //Unreachable statement - compiler-error.

Aşağıdaki aynı sonsuz while döngü, ancak gayet iyi çalışıyor ve ben sadece bir boolean değişken ile şartı yerine herhangi bir hata sorun yok.

boolean b=true;

while(b) {
    System.out.println("inside while");
}

System.out.println("while terminated"); //No error here.

İkinci durumda da, sonra loop deyimi bir boolean değişken b true derleyici hiç şikayet etmez, çünkü belli ki hala erişilemiyor. Neden?


Düzenleme :Aşağıdaki sürüm while sıkışıyor içine sonsuz bir döngü gibi aşikar ama sorunlar derleyici hataları için deyimi altında olsa bile if koşul döngü içinde her zaman false ve sonuç olarak, bu döngü asla geri dönmek ve tespit ederek derleyici de derleme zamanı kendisi.

while(true) {

    if(false) {
        break;
    }

    System.out.println("inside while");
}

System.out.println("while terminated"); //No error here.

while(true) {

    if(false)  { //if true then also
        return;  //Replacing return with break fixes the following error.
    }

    System.out.println("inside while");
}

System.out.println("while terminated"); //Compiler-error - unreachable statement.

while(true) {

    if(true) {
        System.out.println("inside if");
        return;
    }

    System.out.println("inside while"); //No error here.
}

System.out.println("while terminated"); //Compiler-error - unreachable statement.

Düzenleme :if while ile aynı şey.

if(false) {
    System.out.println("inside if"); //No error here.
}

while(false) {
    System.out.println("inside while");
    // Compiler's complain - unreachable statement.
}

while(true) {

    if(true) {
        System.out.println("inside if");
        break;
    }

    System.out.println("inside while"); //No error here.
}      

while aşağıdaki versiyonu da sonsuz bir döngüye takılıyor.

while(true) {

    try {
        System.out.println("inside while");
        return;   //Replacing return with break makes no difference here.
    } finally {
        continue;
    }
}

Bu finally blok her zaman return deyim try blok kendi içinde daha önce karşılaştığında bile idam olmasıdır.

CEVAP
20 Aralık 2011, Salı


Derleyici kolayca ve net bir biçimde ilk ifade kanıtlayabilirimher zamansonsuz bir döngü oluşur, ama ikinci için hiç de kolay değil. Oyuncak örnekte ne varsa: basit, ama değil

  • değişken içeriğini bir dosya okuma?
  • değişken yerel değildi ve başka bir iş parçacığı tarafından değiştirilmiş olabilir mi?
  • değişken bazı kullanıcı giriş dayanıyordu?

Derleyici açıkça bu yol tamamen iptal oldu çünkü daha basit durumda sizin için kontrol ediyor. Neden? Çünküçok daha zorspec tarafından yasak. section 14.21 bkz

(Bu arada, benim derleyiciyokdeğişken*.* 30) bildirirken şikayet

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • guillaume2111's channel

    guillaume211

    19 Kasım 2006
  • RickardRick

    RickardRick

    9 Mart 2007