Sonunda bir blok her zaman Java'da y├╝r├╝t├╝l├╝r m├╝?


Al─▒nan cevaba git


Bu kodu g├Âz ├Ân├╝nde bulundurursak , ne olursa olsun , blo─čun her zaman ├žal─▒┼čt─▒─č─▒ndan kesinlikle emin olabilir miyim ? finally something()

 try {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("I don't know if this will get printed out");
}
 

2260









Cevap say─▒s─▒n─▒ say: 30






Evet, ya da kod bloklar─▒n─▒n finally y├╝r├╝t├╝lmesinden sonra aranacakt─▒r. try catch

Sadece zamanlar finally aranmaz:

  1. E─čer ├ža─č─▒rd─▒ysan System.exit()
  2. JVM ├Ânce kilitlenirse
  3. JVM, try veya catch blo─čunda sonsuz bir d├Âng├╝ye (veya ba┼čka bir kesintiye u─čramaz, sonland─▒r─▒c─▒ olmayan bir ifadeye) ula┼č─▒rsa
  4. ─░┼čletim sistemi zorla JVM i┼člemini sonland─▒r─▒rsa; ├Ârne─čin, kill -9 <pid> UNIXÔÇÖde
  5. Ana sistem ├Âl├╝rse; ├Ârne─čin, elektrik kesintisi, donan─▒m hatas─▒, i┼čletim sistemi panik, vb.
  6. E─čer finally blok bir daemon thread taraf─▒ndan ├žal─▒┼čt─▒r─▒lacaksa ve di─čer t├╝m daemon-thread konular─▒ ├ž─▒k─▒┼čtan ├Ânce finally ├ža─čr─▒l─▒r.

2536







├ľrnek kod:

 public static void main(String[] args) {
    System.out.println(Test.test());
}

public static int test() {
    try {
        return 0;
    }
    finally {
        System.out.println("finally trumps return.");
    }
}
 

Çıktı:

 finally trumps return. 
0
 

528







Ayr─▒ca, her ne kadar k├Ât├╝ bir uygulama olsa da, nihayet blo─čun i├žinde bir return ifadesi varsa, normal blo─čun di─čer herhangi bir getirisini atar. Ba┼čka bir deyi┼čle, a┼ča─č─▒daki sat─▒r yanl─▒┼č d├Ând├╝r├╝r:

 try { return true; } finally { return false; }
 

Son bloktaki istisnalar─▒ atmakla ayn─▒ ┼čey.


372







─░┼čte Java Dil Belirtimi'nden resmi kelimeler.

14.20.2. Try-finally ve try-catch-finally'─▒n y├╝r├╝t├╝lmesi

Bir try bir ile deyim finally blo─ču ilk y├╝r├╝terek y├╝r├╝t├╝l├╝r try blo─ču. O zaman bir se├žim var:

  • try Blo─čun y├╝r├╝t├╝lmesi normal olarak tamamlan─▒rsa, [...]
  • try Blo─čun y├╝r├╝t├╝lmesi V throw de─čerindeki a nedeniyle aniden tamamlan─▒rsa , [...]
  • try Blo─čun y├╝r├╝t├╝lmesi, ba┼čka herhangi bir nedenden R aniden tamamlan─▒rsa , finally blok y├╝r├╝t├╝l├╝r. O zaman bir se├žim var:
    • Son blok normal olarak tamamlan─▒rsa, try ifade R nedeni i├žin aniden tamamlan─▒r .
    • E─čer finally blok nedenle aniden tamamlar S , daha sonra try aniden sebeple deyimi tamamlamalar S ( ve neden R at─▒l─▒r ).

─░├žin ┼čartname return asl─▒nda bu a├ž─▒k yapar:

JLS 14.17 ─░ade Beyan─▒

 ReturnStatement:
     return Expression(opt) ;
 

Kontrol├╝, onu i├žeren metodun veya kurucunun ba┼čkana devretme giri┼čiminde bulunmayan bir return ifade . Expression

Bir return bir deyimiyle Expression giri┼čimi onu i├žeren y├Ântemin invoker kontrol├╝ aktarmak ├╝zere, de─čerinin Expression de─čeri, y├Ântem ├ža─čr─▒s─▒n─▒n de─čeri olur.

Yukar─▒daki a├ž─▒klamalar "demek giri┼čimleri aktar─▒m─▒ kontrol├╝ne sadece" yerine " transfer kontrol e─čer varsa, ├ž├╝nk├╝" try y├Ântemi veya olan yap─▒c─▒ i├žindeki ifadeler try bloklar─▒ i├žeren return a├ž─▒klama, daha sonra herhangi bir finally olanlar─▒n maddeleri try tablolar─▒n en d─▒┼čtaki i├žteki, s─▒rayla ├žal─▒┼čt─▒r─▒l─▒r , kontrol├╝n metodun ya da yap─▒c─▒n─▒n ├ža─čr─▒c─▒s─▒na aktar─▒lmas─▒ndan ├Ânce. Bir finally c├╝mlenin aniden tamamlanmas─▒, bir return ifadenin ba┼člatt─▒─č─▒ kontrol├╝n transferini bozabilir .


251







Di─čer yan─▒tlara ek olarak, 'sonunda' herhangi bir istisna / d├Ând├╝r├╝len de─čeri try..catch blo─čuyla ge├žersiz k─▒lma hakk─▒na sahip oldu─čunu belirtmek ├Ânemlidir. ├ľrne─čin, a┼ča─č─▒daki kod 12 d├Ând├╝r├╝r:

 public static int getMonthsInYear() {
    try {
        return 10;
    }
    finally {
        return 12;
    }
}
 

Benzer ┼čekilde, a┼ča─č─▒daki y├Ântem bir istisna atmaz:

 public static int getMonthsInYear() {
    try {
        throw new RuntimeException();
    }
    finally {
        return 12;
    }
}
 

A┼ča─č─▒daki y├Ântem onu ÔÇőÔÇőat─▒yor olsa da:

 public static int getMonthsInYear() {
    try {
        return 12;          
    }
    finally {
        throw new RuntimeException();
    }
}
 

153







Yukar─▒daki ├Ârne─či hafif bir de─či┼čiklikle denedim.

 public static void main(final String[] args) {
    System.out.println(test());
}

public static int test() {
    int i = 0;
    try {
        i = 2;
        return i;
    } finally {
        i = 12;
        System.out.println("finally trumps return.");
    }
}
 

Yukar─▒daki kod ├ž─▒kt─▒lar─▒:

Sonunda geri d├Ân├╝┼č kozlar─▒.
2

Bunun nedeni return i; , y├╝r├╝tmenin ne zaman i 2 de─čerine sahip oldu─čudur. Bundan sonra, finally blok, 12'nin atand─▒─č─▒ i ve sonra y├╝r├╝t├╝ld├╝─č├╝ yerde System.out y├╝r├╝t├╝l├╝r.

finally Blo─ču y├╝r├╝tt├╝kten sonra blok, try 12 d├Ând├╝rmek yerine 2 d├Ând├╝r├╝r, ├ž├╝nk├╝ bu return c├╝mlesi tekrar ├žal─▒┼čt─▒r─▒lmaz.

Bu kodu Eclipse'de hata ay─▒klayacaksan─▒z System.out , finally blok ├žal─▒┼čt─▒r─▒ld─▒ktan sonra blok return ifadesinin try tekrar y├╝r├╝t├╝ld├╝─č├╝n├╝ hissedeceksiniz . Ancak bu durum b├Âyle de─čil. Sadece 2 de─čerini d├Ând├╝r├╝r.


113







─░┼čte Kevin'in cevab─▒n─▒n bir detayland─▒rmas─▒ . D├Ând├╝r├╝lecek ifadenin finally , daha sonra d├Ând├╝r├╝lse bile daha ├Ânce de─čerlendirildi─čini bilmek ├Ânemlidir .

 public static void main(String[] args) {
    System.out.println(Test.test());
}

public static int printX() {
    System.out.println("X");
    return 0;
}

public static int test() {
    try {
        return printX();
    }
    finally {
        System.out.println("finally trumps return... sort of");
    }
}
 

Çıktı:

 X
finally trumps return... sort of
0
 

104







Sonunda bir blok t├╝m fikri budur. Elbette, di─čer ┼čeylerin yan─▒ s─▒ra geri d├Ând├╝─č├╝n├╝z i├žin, atlanabilecek temizleme i┼člemleri yapt─▒─č─▒n─▒zdan emin olman─▒z─▒ sa─člar.

Sonunda try blo─čunda ne oldu─čuna bak─▒lmaks─▒z─▒n ├ža─čr─▒l─▒r ( siz veya Java Sanal Makinesi ba┼čka bir nedenden ├Ât├╝r├╝ ├ž─▒kmazsa System.exit(int) ).


53







Bunu d├╝┼č├╝nmenin mant─▒kl─▒ bir yolu:

  1. Bir son blo─čuna yerle┼čtirilen kod , try blo─čunda ne olursa olsun ger├žekle┼čtirilmelidir.
  2. Bu nedenle, try blo─čundaki kod bir de─čer d├Ând├╝rmeye veya bir istisna atmaya ├žal─▒┼č─▒rsa, son blok ├žal─▒┼čana kadar ├Â─če 'rafa' yerle┼čtirilir
  3. Son bloktaki kod (tan─▒m gere─či) y├╝ksek ├Ânceli─če sahip oldu─čundan, ne isterse geri d├Ând├╝rebilir veya atabilir. Bu durumda 'rafta' kalan her ┼čey at─▒l─▒r.
  4. Bunun tek istisnas─▒, VM'nin deneme blo─ču s─▒ras─▒nda ├Ârne─čin 'System.exit' taraf─▒ndan tamamen kapanmas─▒d─▒r.

39







Sonunda anormal bir program sonland─▒rma olmad─▒k├ža (System.exit (0) .. ├ža─č─▒r─▒yor gibi) y├╝r├╝t├╝l├╝r. yani, sysout'unuz yazd─▒r─▒lacak


20







Ayr─▒ca nihayet bir geri d├Ân├╝┼č, herhangi bir istisnay─▒ ortadan kald─▒racakt─▒r. http://jamesjava.blogspot.com/2006/03/dont-return-in-finally-clause.html


19







Son blok, bir JVM kilitlenmesinden veya bir ├ža─čr─▒dan kaynaklanacak normal olmayan bir program sonland─▒rma olmad─▒k├ža her zaman ger├žekle┼čtirilir System.exit(0) .

Bunun ├╝zerine, nihayet blo─čun i├žinden d├Ând├╝r├╝len herhangi bir de─čer, nihayet blo─čun y├╝r├╝t├╝lmesinden ├Ânce d├Ând├╝r├╝len de─čeri ge├žersiz k─▒lar, bu nedenle nihayet try'u kullan─▒rken t├╝m ├ž─▒k─▒┼č noktalar─▒n─▒ kontrol etmeye dikkat edin.


18







Hay─▒r, her zaman bir istisna olay─▒ olmaz // System.exit (0); nihayet bloktan ├Ânce nihayet y├╝r├╝t├╝lmesini engeller.

   class A {
    public static void main(String args[]){
        DataInputStream cin = new DataInputStream(System.in);
        try{
            int i=Integer.parseInt(cin.readLine());
        }catch(ArithmeticException e){
        }catch(Exception e){
           System.exit(0);//Program terminates before executing finally block
        }finally{
            System.out.println("Won't be executed");
            System.out.println("No error");
        }
    }
}
 

18







Sonunda her zaman tam mesele budur, sadece d├Ân├╝┼č├╝n ard─▒ndan kodda g├Âr├╝nd├╝─č├╝ i├žin, bunun nas─▒l uyguland─▒─č─▒ anlam─▒na gelmez. Java ├žal─▒┼čma zaman─▒, try bloktan ├ž─▒karken bu kodu ├žal─▒┼čt─▒rma sorumlulu─čuna sahiptir .

├ľrne─čin, a┼ča─č─▒dakilere sahipseniz:

 int foo() { 
    try {
        return 42;
    }
    finally {
        System.out.println("done");
    }
}
 

├çal─▒┼čma zaman─▒ ┼č├Âyle bir ┼čey ├╝retecektir:

 int foo() {
    int ret = 42;
    System.out.println("done");
    return 42;
}
 

Yakalanmam─▒┼č bir istisna at─▒l─▒rsa finally blok ├žal─▒┼č─▒r ve istisna yay─▒lmaya devam eder.


13







Bunun nedeni, i de─čerini 12 olarak atad─▒n─▒z, ancak i de─čerini i┼čleve d├Ând├╝rmediniz. Do─čru kod a┼ča─č─▒daki gibidir:

 public static int test() {
    int i = 0;
    try {
        return i;
    } finally {
        i = 12;
        System.out.println("finally trumps return.");
        return i;
    }
}
 

11







├ç├╝nk├╝ siz System.exit() (veya i┼č par├žac─▒─č─▒ ├ž├Âkt├╝─č├╝nde) aramad─▒k├ža bir son blok her zaman ├ža─čr─▒l─▒r .


10







Cevap basit, EVET .

G─░R─░┼×:

 try{
    int divideByZeroException = 5 / 0;
} catch (Exception e){
    System.out.println("catch");
    return;    // also tried with break; in switch-case, got same output
} finally {
    System.out.println("finally");
}
 

ÇIKTI:

 catch
finally
 

10


2016-08-13





Evet ├ža─čr─▒lacak. Sonunda bir anahtar kelimeye sahip olman─▒n as─▒l amac─▒ budur. E─čer try / catch blo─čundan atlamak, nihayet bloktan atlayabiliyorsa, System.out.println'yi try / catch'in d─▒┼č─▒na koymakla ayn─▒yd─▒.


9







K─▒saca, resmi Java Dok├╝mantasyonunda ( Buraya t─▒klay─▒n ) yaz─▒lm─▒┼čt─▒r -

JVM, try veya catch kodu y├╝r├╝t├╝l├╝rken ├ž─▒karsa, son blok ├žal─▒┼čt─▒r─▒lmayabilir. Benzer ┼čekilde, try veya catch kodunu y├╝r├╝ten i┼č par├žac─▒─č─▒ kesintiye u─črad─▒─č─▒nda veya ├Âld├╝r├╝l├╝rse, uygulama bir b├╝t├╝n olarak devam etse de, sonu├žta blok i┼čleyemeyebilir.


9







Evet, nihayet blok her zaman y├╝r├╝t├╝l├╝r. Geli┼čtiricinin ├žo─ču bu blo─ču, veri taban─▒ ba─člant─▒s─▒n─▒, resultset nesnesini, ifade nesnesini kapatarak kullan─▒r ve ayr─▒ca i┼člemi geri almak i├žin java haz─▒rda bekletme modunda kullan─▒r.


9







Evet, olacak. Aksi takdirde, System.exit () denen veya JVM kilitlenmedi─či s├╝rece, deneyin veya catch blo─čunuzda ne olursa olsun. Bloklarda herhangi bir return ifadesi varsa, nihayet bu return ifadesinden ├Ânce y├╝r├╝t├╝lecektir.


8







Evet olacak. JVM'nin ├ž─▒kmas─▒ veya ├ž├Âkmesi ya┼čanmamas─▒ gereken tek durum


8







@ Vibhash'─▒n cevab─▒na ba┼čka bir cevab─▒n eklenmesi, a┼ča─č─▒dakine benzer bir de─či┼čken nesnede ne oldu─čunu a├ž─▒klar.

 public static void main(String[] args) {
    System.out.println(test().toString());
}

public static StringBuffer test() {
    StringBuffer s = new StringBuffer();
    try {
        s.append("sb");
        return s;
    } finally {
        s.append("updated ");
    }
}
 

Çıktı olacak

 sbupdated 
 

8







A┼ča─č─▒daki program─▒ g├Âz ├Ân├╝nde bulundurun:

 public class SomeTest {

    private static StringBuilder sb = new StringBuilder();

    public static void main(String args[]) {

        System.out.println(someString());
        System.out.println("---AGAIN---");
        System.out.println(someString());
        System.out.println("---PRINT THE RESULT---");
        System.out.println(sb.toString());
    }

    private static String someString() {

        try {
            sb.append("-abc-");
            return sb.toString();

        } finally {
            sb.append("xyz");
        }
    }
}
 

Java 1.8.162'den itibaren, yukar─▒daki kod blo─ču a┼ča─č─▒daki ├ž─▒kt─▒y─▒ verir:

 -abc-
---AGAIN---
-abc-xyz-abc-
---PRINT THE RESULT---
-abc-xyz-abc-xyz
 

Bu, finally nesneleri serbest b─▒rakman─▒n a┼ča─č─▒daki kod gibi iyi bir uygulama oldu─ču anlam─▒na gelir :

 private static String someString() {

    StringBuilder sb = new StringBuilder();

    try {
        sb.append("abc");
        return sb.toString();

    } finally {
        sb = null; // Just an example, but you can close streams or DB connections this way.
    }
}
 

8


2018-04-30





Bu asl─▒nda herhangi bir dilde do─črudur ... sonunda, geri d├Ân├╝┼č├╝n y├Ântem g├Âvdesinde nerede oldu─ču fark etmeksizin, her zaman bir return ifadesinden ├Ânce y├╝r├╝t├╝l├╝r. Durum b├Âyle olmasayd─▒, nihayet blo─čun pek bir anlam─▒ olmazd─▒.


7







Son olarak, try blo─čundaki bir d├Ân├╝┼č├╝n yerine geri d├Ân├╝┼čle ilgili noktaya ek olarak, ayn─▒s─▒ bir istisna i├žin de ge├žerlidir. Bir istisna atan bir blok, try blo─ču i├žinden at─▒lan bir geri d├Ân├╝┼č veya istisnay─▒ de─či┼čtirir.


7







finally y├╝r├╝tecek ve bu kesin.

finally a┼ča─č─▒daki durumlarda y├╝r├╝t├╝lmeyecektir:

dava 1 :

─░dam ederken System.exit() .

durum 2:

JVM / Thread'iniz ├ž├Âkt├╝─č├╝nde.

durum 3:

Uygulaman─▒z aras─▒nda manuel olarak durduruldu─čunda.


7







HER ZAMAN DE─×─░L

Java Dili ├Âzelli─či, try-catch-finally ve try-catch bloklar─▒n─▒n 14.20.2'de nas─▒l ├žal─▒┼čt─▒─č─▒n─▒ a├ž─▒klar
. Hi├žbir yerde, nihayet blo─čun her zaman y├╝r├╝t├╝ld├╝─č├╝n├╝ belirtir. Ancak, try-catch-finally ve try-finally bloklar─▒n─▒n tamamland─▒─č─▒ t├╝m durumlar i├žin, tamamlamadan ├Ânce nihayet y├╝r├╝t├╝lmesi gerekti─čini belirtir.

 try {
  CODE inside the try block
}
finally {
  FIN code inside finally block
}
NEXT code executed after the try-finally block (may be in a different method).
 

JLS garanti etmez FIN sonra y├╝r├╝t├╝l├╝r KODU . E─čer JLS garanti KOD ve SONRAK─░ sonra y├╝r├╝t├╝l├╝r FIN daima sonra infaz edilecek KODU ve ├Ânce ─░LER─░ .

JLS neden nihayet blo─čun her zaman try blo─čundan sonra y├╝r├╝t├╝lece─čini garanti etmiyor? ├ç├╝nk├╝ imkans─▒z. JVM'nin, try blo─čunu tamamlad─▒ktan hemen sonra ancak nihayet blo─čun ├žal─▒┼čt─▒r─▒lmas─▒ndan ├Ânce durdurulmas─▒ muhtemeldir, ancak bu m├╝mk├╝n de─čildir. JLS'nin bunu ├Ânlemek i├žin yapabilece─či hi├žbir ┼čey yok.

Bu nedenle, uygun davran─▒┼člar─▒ i├žin her zaman, bloklar─▒ tamamland─▒ktan sonra y├╝r├╝t├╝len bloklara ba─čl─▒ olan herhangi bir yaz─▒l─▒m t─▒kan─▒r.

Deneme blo─čundaki d├Ând├╝rmeler bu sorunla ilgili de─čildir. Uygulama, try-catch-nihayetinden sonra koda ula┼č─▒rsa, nihayet blo─čun try blo─ču i├žinde, iadeli veya iadeli olmadan ger├žekle┼čtirilmi┼č olmas─▒ garanti edilir.


7







  1. Sonunda Block her zaman idam edilir. Tabi ve orada System.exit () ifadesi var olmad─▒─č─▒ s├╝rece ( nihayet bloktaki ilk ifade).
  2. E─čer System.exit () sonra nihayet blok nihayet blo─čun ├ž─▒k─▒p idam ve kontrol almazs─▒n─▒z ilk ifadedir. Ne zaman System.exit () deyimi sonunda bu ifade nihayet blok ├žal─▒┼čt─▒r─▒lana kadar nihayet blo─ča girdi─činde ve System.exit () g├Âr├╝nd├╝─č├╝nde kontrol kuvveti tamamen sonunda bloktan d─▒┼čar─▒ ├ž─▒kar.

6







─░stisna i┼člemezseniz, program─▒ sonland─▒rmadan ├Ânce JVM sonunda blok uygular. Yaln─▒zca normal program─▒n y├╝r├╝t├╝lmesi, a┼ča─č─▒daki nedenlerden dolay─▒ program─▒n sona ermesi halinde ba┼čar─▒s─▒z olur.

  1. ─░┼člemin iptal edilmesine neden olan ├Ânemli bir hataya neden olarak.

  2. Haf─▒zan─▒n bozulmas─▒ nedeniyle program─▒n sonland─▒r─▒lmas─▒.

  3. System.exit () adl─▒ ki┼čiyi arayarak

  4. Program sonsuz d├Âng├╝ye girerse.


6