আপনি কোনও নতুন ব্যতিক্রম ছুঁড়ে ফেললেও শেষ অবধি কী চলবে?


142

এই someVarকোডটিতে কী ব্লক কার্যকর করা হয় এবং দ্বিতীয় ব্যতিক্রম নিক্ষেপ করা হলেও সেট করা হবে ?

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}

2
কারণ এমন পরিস্থিতি রয়েছে যেখানে আচরণটি প্রত্যাশার মতো হয় নি, যেমন @ গ্যারিএফ দ্বারা নির্দেশিত
জ্যাক্স

1
এটি লক্ষণীয় যে চূড়ান্ত ব্লকটি যদি কোনও ব্যতিক্রম ছুঁড়ে ফেলে, বা প্রত্যাবর্তন করে তবে প্রত্যাশা অনুযায়ী কার্যকর করা যায় না।
পিটার লরি

উত্তর:


184

হ্যাঁ, শেষ অবধি সর্বদা চলতে থাকে ... ব্যতীত:

  • চেষ্টা করুন-অবশেষে অবরুদ্ধ ব্লকটি চালানো থ্রেডটি মারা বা বাধা হয়ে দাঁড়িয়েছে
  • তুমি ব্যাবহার কর System.exit(0);
  • অন্তর্নিহিত ভিএম অন্য কোনও উপায়ে ধ্বংস হয়
  • অন্তর্নিহিত হার্ডওয়্যার কোনও উপায়ে ব্যবহারযোগ্য

অতিরিক্তভাবে, যদি আপনার অবশেষে ব্লকের কোনও পদ্ধতি যদি একটি অব্যক্ত ব্যতিক্রম ছুঁড়ে দেয় তবে তার পরে আর কিছুই কার্যকর করা হবে না (অর্থাত্ ব্যতিক্রমটি অন্য কোনও কোডের মতোই ছুঁড়ে দেওয়া হবে)। এটি ঘটে যাওয়ার একটি খুব সাধারণ ঘটনা java.sql.Connection.close()

একদিকে যেমন, আমি অনুমান করছি যে আপনি যে কোড নমুনাটি ব্যবহার করেছেন তা নিছক একটি উদাহরণ, তবে অবশেষে কোনও অবরুদ্ধের মধ্যে প্রকৃত যুক্তি স্থাপনের বিষয়ে সতর্ক থাকুন। অবশেষে অবরুদ্ধকরণটি রিসোর্স ক্লিন-আপ (ডিবি সংযোগগুলি বন্ধ করা, ফাইল হ্যান্ডলগুলি প্রকাশ করা ইত্যাদি) জন্য পরিচালিত, অবশ্যই চালিত যুক্তির জন্য নয়। যদি আপনার চালনা অবশ্যই এটির চেষ্টা-ব্লকের আগে করা উচিত তবে কোনও ব্যতিক্রম ছুঁড়ে ফেলতে পারে, কারণ আপনার উদ্দেশ্য প্রায় কার্যত একই রকম।


4
"ট্রাই-ক্যাচ-অবশেষে ব্লকটি চলমান থ্রেডটি [...] বাধা পেয়েছে" এর অর্থ এখানে কী? সম্ভবত সেই ডকুমেন্টেশনটি খারাপভাবে শব্দযুক্ত, তবে থ্রেড.ইনটার্ট্রাপ্ট () চেষ্টা করে বা ক্যাচ ব্লক থেকে ছুঁড়ে দেওয়া হোক না কেন, অবশেষে ব্লকটি এড়ানো যাবে না। এটি কি থ্রেড.স্টপ () এর মতো আরও হিংস্র কিছু বোঝাতে "বাধা" ব্যবহার করে?
জো কেয়ার্নি

@ জো: হ্যাঁ, আমি মনে করি এখানে ডকুমেন্টেশনটি কিছুটা খারাপভাবে শব্দযুক্ত, এবং এগুলি থ্রেডের ক্রিয়াকলাপে সাধারণ বাধা বোঝায়।
গ্যারিএফ

@ গ্যারিএফ - আমি মনে করি আপনি জেএলএস থেকে উদ্ধৃতি দিচ্ছেন। জেএলএস শব্দটি মাঝে মাঝে কিছুটা অদ্ভুত হয় তবে আপনি সাধারণত দেখতে পাবেন যে অদ্ভুত পরিভাষাটির অর্থ ডকুমেন্টের অন্য কোথাও পরিষ্কারভাবে সংজ্ঞায়িত হয়েছে। জেএলএস একটি স্পেসিফিকেশন এবং এর প্রাথমিক লক্ষ্য হিসাবে যথাযথতা (পঠনযোগ্যতার চেয়ে) রয়েছে।
স্টিফেন সি

1
@ স্টেফেন সি - আসলে, এটি জাভাএসই টিউটোরিয়াল থেকে এসেছে (অন্যদের সাথে লিঙ্কিত)। এটি জেএলএসে একইভাবে শব্দযুক্ত হতে পারে তবে আমি প্রাসঙ্গিক অংশটি খুঁজে পাচ্ছি না। আমি এটি 11 অধ্যায় (ব্যতিক্রম), অধ্যায় 14 (বিবৃতি) বা অধ্যায় 15 (এক্সপ্রেশন) এ প্রত্যাশা করেছি, তবে স্পষ্টভাবে বাধাগুলি উল্লেখ করে কিছু দেখতে পাচ্ছি না। আমি অবশ্যই এটি দেখতে আগ্রহী হতে হবে।
গ্যারিএফ

1
@ গ্যারিএফ - আমি দেখছি আসলে জেএলএস বিবৃতি "সাধারণ" এবং "আকস্মিক" সমাপ্তির কথা বলে, এবং একটি ধারা রয়েছে (14.1) যা পরিভাষা সংজ্ঞায়িত করে। এর আচরণটি finallyতখন সাধারণ এবং আকস্মিক সমাপ্তির পরিপ্রেক্ষিতে নির্দিষ্ট করা হয়।
স্টিফেন সি

10

হ্যাঁ.

ডকুমেন্টেশন দেখুন :

চেষ্টা ব্লকটি যখন প্রস্থান হয় তখন অবশেষে ব্লকটি সর্বদা কার্যকর করে।

ব্যতিক্রমসমূহ:

দ্রষ্টব্য: চেষ্টা বা ক্যাচ কোড কার্যকর করার সময় যদি জেভিএম প্রস্থান করে, তবে অবশেষে ব্লকটি কার্যকর করতে পারে না। তেমনিভাবে, চেষ্টা চালানোর থ্রেড বা ক্যাচ কোডটি বাধাগ্রস্ত বা হত্যা করা হয়, শেষ পর্যন্ত ব্লকটি কার্যকর না হলেও পুরো প্রয়োগটি চালিয়ে যেতে পারে।


2

অবশেষে, ব্লক সর্বদা কার্যকর করে।

public class ExceptionTest {

public static void someFunction(String input) throws Exception {
    try {
        if( input.equals("ABC") ) {
            System.out.println("Matched");
        }
    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        System.out.println("Input Is "+input+" Finally Executed!!!");
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        System.out.println("********* Test with VALUE ********* ");
        someFunction("ABC");
        System.out.println("\r\n********* Test with NULL  ********* ");
        someFunction(null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

জাভা চেষ্টা করুন শেষ পর্যন্ত থ্রো দিয়ে ব্লক করুন


2

সবশেষে সর্বদা মৃত্যুদন্ড কার্যকর করা হয়, আপনার মামলার অর্থ যাই হোক না কেন

  • চেষ্টা করুন-অবশেষে অবরুদ্ধ
  • ছোঁড়ার

চেক করা ব্যতিক্রমগুলির জন্য, জাভা হ্যান্ডেল দেয় না, ত্রুটি পরিচালনা করে। এই কারণটি হ'ল, যদি একটি চেক করা ব্যতিক্রম অবশেষে অবরুদ্ধ হয়ে থাকে এবং তার জন্য কোনও পরিচালনা করা না হয়, তবে এই পয়েন্টের নীচে লিখিত কোডটি (যেখানে ত্রুটি ঘটেছে) কার্যকর করা হবে না।

তাই আমি সর্বদা সমস্ত ব্যতিক্রম হ্যান্ডেল করার পরামর্শ দিচ্ছি এটি চেক বা চেক না করা হতে পারে। এইভাবে আপনি নিশ্চিত করতে পারেন যে শেষ পর্যন্ত কোড ব্লকটিও কার্যকর করা হয় যদি তা পরীক্ষা না করেও চেক করা ব্যতিক্রম ঘটে। আপনার প্রয়োজনীয় কাজটি শেষ করতে আপনার কাছে সাব-নেস্ট ক্যাচ এবং অবশেষে অবরুদ্ধ করার একটি জায়গা রয়েছে ।



1

হ্যাঁ. finallyআপনি System.exit () কে কল করুন এমন ঘটনা বাদে সর্বদা ব্লক কার্যকর করে কারণ এটি জাভা ভিএম বন্ধ করে দেয়।


সিস্টেম.এক্সিট () এর পরেও শাটডাউন হুকগুলি ডাকা হয় তবে বিদ্যমান নন-সিস্টেম থ্রেডগুলি সমস্ত বন্ধ হয়ে যায়।
পিটার লরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.