Ақыры арасындағы айырмашылық және балықтан кейін жазу

«Ақырында» деген сөздің арасында қандай айырмашылық бар және «catch» дегеннен кейін жазыңыз?

Мысалға:

public boolean example() {
    try {
       //Code
    } catch (RuntimeException e) {
       //Code
    } finally {
        return true;
    }
}

public boolean example() {
    try {
       //Code
    } catch (RuntimeException e) {
       //Code
    } 
    return true;
}
8
Сіз логиканы nihai блоктағы мәлімдемені жабу үшін және осында алып тастау үшін логика қосуыңыз мүмкін, сондықтан соңғы нұсқасы (IMO) ең жақсы балама болады.
қосылды автор Luiggi Mendoza, көзі
Сіздің мысалыңызда ешқандай айырмашылық жоқ. Ақырында кейбір тазалау жұмыстары орындалады.
қосылды автор Tala, көзі

10 жауаптар

Ең алдымен, кандидаты ретінде қарастырыла алатын жалғыз идома бұл:

try {
 //stuff
} catch (Throwable t) { /* handle */ }
// finally stuff

Ұсталған түрге назар аударыңыз. ThreadDeath және VirtualMachineError секілді қараңғы монстртерді қоса алғанда, кез-келген ықтимал ерекшеліктерді ұстасаңыз, тек қана тырнақшаның астындағы кодты сөзсіз қол жеткізуге болады деп үміттене аласыз.

Бірақ бұл тек қана басталатын жерде. Егер өңдеу коды ерекше жағдай туғызса не істеу керек? Сондықтан кем дегенде керек

try { /* main stuff */ }
catch (Throwable t) {
  try { /* handle */ } catch (Throwable t) { 
   //no code allowed here! Otherwise we descend into infinite recursion
  }
}
/* finally stuff */

Енді сіз nihoyat артықшылығын түсіне бастай аласыз, бірақ бұл бәрі емес. Әдеттегі сценарийді қарастырайық:

try { 
  /* main stuff, may throw an exception. I want the exception to
     break what I'm doing here and propagate to the caller */ 
  return true;
} finally { /* clean up, even if about to propagate the exception */ }

Мұны қалай қайта жазасыз? Кодын қайталамай, мүмкін емес.

5
қосылды

Сіз көрсеткен кодта ешқандай айырмашылық жоқ. Бірақ, ақыр соңында, қандай да бір ерекшелік бар ма, жоқ па, сынақ блогынан кейін кейбір код бөлігін іске қосу үшін қолданылады.

Мұнда қызықты нәрсе жасау керек, біз ақырында блоктан қайтып кетуден аулақ болуымыз керек, өйткені ол көрнекі жағдайдағы шатастыруды тудыруы мүмкін. Бұл кодты қарастырыңыз:

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

Енді бұл код не істеп жатқанына қарамастан жалған болады. Көптеген жағдайларда бұл мінез-құлықтың түпкілікті түсінуіне сай келеді - «бұл әрекетті алдын-ала сынау блогында не болғанына қарамастан, әрқашан осы кодты іске қосыңыз». Демек, шындықты түпкілікті блоктан қайтаратын болсаңыз, жалпы нәтиже әрқашан шындықты қайтару керек, жоқ па?

Жалпы айтқанда, бұл сирек идиома және сіз соңында пайдалануға тиіс   ресурстарды тазарту/жабу үшін либералды түрде, бірақ сирек болса да   олардың мәнін қайтарады.

3
қосылды
Ақырында, бірден тоқтатылады, қайтару немесе алып тастау, кез келген бұрынғы функционалдық шақыру қайтару елемейді. Бұл дегеніміз, кез келген алып тастауды немесе қарапайым қайтару мәнін, егер ол ерекше жағдайды шығарса немесе қайтаруды пайдаланса, жұтатын болады. Ресурстарды тазарту үшін тек қана пайдаланғаны туралы мәлімдеңіз және соңғы кезде қоңырау шалсаңыз, ерекше жағдайды алып тастай алатындығыңызды ескеріңіз, басқа ерекшеліктерді жұтып қоймау үшін оларды сынап көріңіз. Егер Try-with-ресурстарын қолдансаңыз, Throwable.getSuppressed() көмегімен жұтылмаған ерекше жағдайды аласыз
қосылды автор Klaus Groenbaek, көзі

Сіздің ісіңізде ешқандай айырмашылық жоқ. бірақ

Жұмыс уақыты жүйесі әрдайым сайып келгенде блогы ішіндегі мәлімдемелерді орындайды. сынақ блогында не болады.

Сондықтан тазалауды орындау үшін тамаша орын.

Егер сіз JDK 7+ пайдалансаңыз, соңғы блоктың басым көпшілігін тек ресурстармен әрекет ету туралы өтініш .

2
қосылды

Ақырында (), тіпті, егер қандай да бір жағдай туындаса, кодтың кейбір желісі орындалуы керек болғанда қолданылады Бірақ егер ол жазылғаннан кейін кодты жолды жазса, ол болмаса, орындалмайды.

2
қосылды
Бұл жай ғана дұрыс емес. Коды сынақтан өткізгеннен кейін орындалады.
қосылды автор Pieter De Bie, көзі

Біз бұғаттауды қолданамыз, аулау блогын пайдаланамыз, және, ақырында, біздің бағдарламамыздағы Ерекшелікті өңдеу үшін бұғаттаймыз. Бағдарламада тек Exception (Тексеру) немесе check (Тексеру) параметрлері болуы мүмкін. сондықтан бұл блок осы Ерекшеліктерді өңдеу үшін пайдаланылады. Сынақ блогында біз Exception туындауы мүмкін кодты жазып немесе жазамыз және егер біздің коды іске қосылса, Exception occurred болғанда, біз сол кодты catch блогында жазамыз. ақыр соңында, бізде ерекше блок бар, ол біздің бағдарламамыз бітпейінше, блок кодын дұрыс орындамас бұрын, біздің пештің блогы іске қосылмаса. негізінен бұл бағдарламаны қажетсіз бағдарлама аяқталған кезде сақтауға арналған. егер біз сынақ блогын қолданатын болсақ, сынақ блогынан кейін аулау блогы болуы керек, бірақ ақыр соңында міндетті емес міндетті болып табылады.

1
қосылды

Кодыңыз тек true/false қайтаратындықтан, ол соншалықты көп әсер етпейді. Бірақ қандай да бір міндетті/тазалау кодын орындау үшін жазылған кез келген басқа код/​​логика туралы ойланыңыз.

Сондай-ақ, біздің код арқылы барлық ерекшеліктерді ұстау қиын болады, немесе басқаша айтқанда, біз өзіміз шеше алатын ерекше ерекшеліктерді ұстауымыз керек. Бұл кезде nihai нақты құтқарушы болады, себебі ол әрдайым орындалады ( System.exit() немесе кейбір рекурсиялық жағдайда).

Сондай-ақ, біздің кодқа сәйкес келу үшін, кез-келген тазарту кодын орындау үшін әрқашан ақыр соңында блогын пайдалану керек.

Қосымша түсініктеме алу үшін төменде көрсетілген хабарламаларға сілтеме жасай аласыз:

0
қосылды

Бірінші жағдайда:

Егер сынақ блоктарында ерекше жағдай орын алса, онда блок блок орындалады және қайталанбайтын болса, бірдей аулау блогына қызмет көрсету кезінде, сайып келгенде блок орындалады.

Екінші оқиға:

Егер сынақ блоктарында ерекше жағдай орын алса, аулау блогы орындалады, ал егер бірдей аулау блогында одан әрі ерекшелеу болса, «шын мәнін қайтарады»;

0
қосылды

Ақырында блок сіздің кодты ашық ағындарды жабу сияқты тазалау үшін пайдалы.

Мысалы:

    File f = new File("\file.txt");
    FileStream fs;
    try{
       fs = new FileStream(f);
    } catch (IOException ioe){
       ioe.printStackTrace();
    } finally {
      if (fs != null) {
         fs.close()//close the stream
      }
    }
0
қосылды

Біріншіден, бұл сұрақты түсіну үшін «неге біз тырысамыз» catch {} block «Ok».

Жауап, біздің кодты алып тастау мүмкіндігі болған кезде.

These kind of code we put in try{... } block & catch {...} block contain the code to catch the exception generated by code in try{ } block.

Ақырында, {...} блогында {} block {} блокты қоспағанда, орындалатын код бар.

Мысалы, кейбір веб-сайтқа кіргенде, бірақ кейбір серверлік мәселе бойынша «404 қатесі немесе сервері жаңартылуда» секілді қандай да бір хабарламаны көрсете алмай, бет көрсете алмайды, бұл кодтың соңында блокта жазылады.

0
қосылды

бұл қарапайым аулау тек қана catch eXception және оны өңдейді, бірақ, ең соңында, Exception немесе Exception болса, мысалы, жақын байланыстар үшін орындаңыз.

0
қосылды