2017-06-04 17 views
5

Bu soruya rastladım ve verenin verdiği sonucu anlayamıyorum.Dize sonunda döndürülür ve bloklamayı deneyin

programdır:

public static String method(){ 

    String s = new String(); 
    try 
    { 
     s = "return value from try block"; 
     return s; 
    } 
    catch (Exception e) 
    { 
     s = s + "return value from catch block"; 
     return s; 
    } 
    finally 
    { 
     s = s + "return value from finally block"; 
    } 

} 

çıktısı: try'ın

den

dönüş değeri Şimdi, bunu ve return s deyimi de s değerini ayıklanacak try bloğu return value from try block, return value from catch block sonra oldu returned from finally block.

Hareketsiz çıktısı: try'ın

den

dönüş değeri herhangi birinin bu davranışı açıklar mısınız?

+0

Buna bir https: // stackoverflow bakın.com/questions/65035/does-finally-in-java ile çalışın – mmuzahid

+1

Burada daha fazla açıklama bulacaksınız [Try-catch-nihayet-getiri açıklama - Stack Overflow] (https://stackoverflow.com/questions/15225819/try-catch-finally-return-clarification) –

+0

Yanıt, Oracle belgelerinden geliyor: "Son olarak bloğu, try bloğu çıkarıldığında her zaman çalışır. Bu, beklenmedik bir istisna meydana gelse bile son bloğun yürütülmesini sağlar. " bu referansı kontrol edin: https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – Oghli

cevap

1

Her şeyden önce, Java'nın yöntem çağrılarını nasıl işlediğini anlayalım. Her iş parçacığı için ayrı yığın belleği vardır. Herhangi bir yöntemi çağırdığımızda, Java dahili olarak yığının üstüne bir kayıt ekler. Kayıt, & nesnesi vb. Gibi bazı ayrıntıları içerir.

Burada ilginç bir alan var: dönüş değeri. Dönüş ifadesiyle her karşılaşıldığında, alan güncelleştirilir. Şimdi kodu gözlemleyin.

try satırında, dönüş değeri alanı try satırından dönüş değerine ayarlanır. Şimdi yürütme sırasına göre finally bloğu yürütülür. Şimdi finally bloğu s dize referansını değiştirir. Daha önce try bloğu tarafından yerleştirilen return value alanını değiştirmedi. Sonunda yöntem çağrısı tamamlandı & Java dahili olarak & kayıt değerini döndürün. Böylece, döndürme değerini try bloğundan döndürür.

finally bloğu, değişiklikten sonra dizgeyi döndürürse, dönüş değeri alanı tekrar güncellenir ve güncelleştirilmiş dize döndürülür. Sonunda nihayet

kod çalıştırmak için bir deneme/yakalama deyiminde kullanılan

-2

"her zaman"

lock.lock(); 
try { 
    //do stuff 
} catch (SomeException se) { 
    //handle se 
} finally { 
    lock.unlock(); //always executed, even if Exception or Error or se 
} 

Java 7 yeni o açıkça otomatik olarak kapanmasını kaynakları kullanmak üzere kaynakların ifadesiyle denemek vardır kodunuzda finally dahil yerine yöntemin sonunda kullanırsanız veya örtük try block yılında java.io.Closeable veya java.lang.AutoCloseable

İlgili konular