আমি জাভা 7 টি চেষ্টা করে-সংস্থানগুলি সঠিকভাবে ব্যবহার করছি


87

আমি আশা করছি বাফার রিডার এবং ফাইল রিডারটি বন্ধ হবে এবং যদি ব্যতিক্রম ছড়িয়ে দেওয়া হয় তবে রিসোর্সগুলি প্রকাশিত হবে।

public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
    try (BufferedReader br = new BufferedReader(new FileReader(filePath)))
    {
        return read(br);
    } 
}

তবে, catchসফলভাবে বন্ধের জন্য কি কোনও ধারা থাকতে হবে ?

সম্পাদনা:

মূলত, জাভা in-এর উপরের কোডটি জাভা for এর জন্য নীচের সমতুল্য:

public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{

    BufferedReader br = null;

    try
    {
        br = new BufferedReader(new FileReader(filePath));

        return read(br);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        try
        {
            if (br != null) br.close();
        }
        catch(Exception ex)
        {
        }
    }

    return null;
}

আপনার প্রশ্নটি আবার পড়ার পরে, আমি এটি ভালভাবে বুঝতে পারছি কিনা তা নিশ্চিত নই। আপনি দয়া করে এটি ব্যাখ্যা করতে পারেন?
মেরুন

ওহে. চিতা, আমি catchজাভা for এর জন্য আপনার উদাহরণের প্রথমটির ভূমিকাটি বোঝার চেষ্টা করছি I অর্থ catch (Exception ex) { throw ex; }- এটি কেবল ব্যতিক্রমটিকে নিক্ষেপ করছে, এটি কিছুই করছে না, এটি কোনও আঘাত ছাড়াই সহজেই সরানো যেতে পারে। নাকি আমি কিছু মিস করছি?
সাশা

উত্তর:


103

এটি সঠিক এবং catchধারাটির কোনও প্রয়োজন নেই । ওরাকল জাভা 7 ডক বলেছেন রিসোর্স নির্বিশেষে বন্ধ হয়ে যাবে যে কোনও ব্যতিক্রম আসলে নিক্ষেপ করা হোক ।

আপনি catchযদি ব্যতিক্রমটি প্রতিক্রিয়া জানাতে চান তবে আপনার একটি ধারা ব্যবহার করা উচিত । রিসোর্স বন্ধ হয়ে যাওয়ার পরে এই catchধারাটি কার্যকর করা হবে ।

ওরাকলের টিউটোরিয়াল থেকে এখানে একটি স্নিপেট রয়েছে :

নিম্নলিখিত উদাহরণটি একটি ফাইল থেকে প্রথম লাইনটি পড়ে। ফাইল থেকে ডেটা পড়ার জন্য এটি বাফার্ডারিডারের উদাহরণ ব্যবহার করে। বাফারড্রেডার এমন একটি সংস্থান যা প্রোগ্রামটি শেষ হওয়ার পরে অবশ্যই এটি বন্ধ করে দেওয়া উচিত:

static String readFirstLineFromFile(String path) throws IOException {
    try (BufferedReader br =
                   new BufferedReader(new FileReader(path))) {
        return br.readLine();
    }
} // In this example, the resource declared in the try-with-resources statement is a BufferedReader.

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

সম্পাদনা

নতুন সম্পাদিত প্রশ্ন সম্পর্কিত:

জাভা 6-তে কোডটি catchপরে এবং পরে finallyব্লকটি কার্যকর করে। এর ফলে catchব্লকগুলিতে সংস্থানগুলি সম্ভাব্যভাবে খোলা থাকবে ।

জাভা 7 সিনট্যাক্সে, ব্লকের আগে সংস্থানগুলি বন্ধ হয়ে যায় catch, তাই catchব্লক কার্যকর করার সময় ইতিমধ্যে সংস্থানগুলি বন্ধ হয়ে যায় । এটি উপরের লিঙ্কে নথিভুক্ত করা হয়েছে:

একটি সংস্থান-সংস্থান সংক্রান্ত বিবৃতিতে, ঘোষিত সংস্থানগুলি বন্ধ হওয়ার পরে যে কোনও ক্যাচ বা অবশেষে অবরুদ্ধ চালানো হবে।


69

আপনার ব্যবহারের-সংস্থানগুলির ব্যবহার এই বিশেষ ক্ষেত্রে সূক্ষ্মভাবে কাজ করবে, তবে এটি সাধারণভাবে একেবারেই সঠিক নয়। আপনার এমন সংস্থানগুলি চেইন করা উচিত নয় কারণ এটি অপ্রীতিকর আশ্চর্য হতে পারে। ধরে নিন আপনার একটি পরিবর্তনশীল বাফার আকার রয়েছে:

public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
    int sz = /* get buffer size somehow */
    try (BufferedReader br = new BufferedReader(new FileReader(filePath), sz))
    {
        return read(br);
    } 
}

ধরে নিন যে কিছু ভুল হয়েছে এবং আপনি szনেতিবাচক হয়ে শেষ করেছেন । এই ক্ষেত্রে আপনার ফাইল সংস্থান (এর মাধ্যমে তৈরি new FileReader(filePath)) বন্ধ হবে না

এই সমস্যাটি এড়াতে আপনার প্রতিটি সংস্থান আলাদাভাবে নির্দিষ্ট করা উচিত:

public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
    int sz = /* get buffer size somehow */
    try (FileReader file = new FileReader(filePath);
         BufferedReader br = new BufferedReader(file, sz))
    {
        return read(br);
    } 
}

এক্ষেত্রে এমনকি brব্যর্থতার সূচনাটি fileএখনও বন্ধ হয়ে গেলেও । আপনি এখানে এবং এখানে আরও বিশদ খুঁজে পেতে পারেন ।


আমি বোঝার চেষ্টা করছি যে এসজেটিটি নেতিবাচক হলে এর মাধ্যমে তৈরি উত্সটি কেন নিক্ষেপ new FileReader(filePath))হবে না an IllegalArgumentExceptionচেষ্টা-সহ-সংস্থানগুলি AutoClosableকোনও ছোঁড়া ব্যতিক্রম নির্বিশেষে সমস্ত সংস্থান বন্ধ করে না?
প্রসূন জোশী

4
@ প্রসূন জোশি না, এটি কেবলমাত্র সেই চলকগুলির .close()জন্য আহ্বান জানিয়েছে যা চেষ্টা-সংস্থান-সংস্থান আরম্ভকারী হিসাবে ঘোষণা করা হয়েছে in এই কারণেই এই উদাহরণে এটি দুটি ঘোষণায় পৃথক করা কৌশলটি করে।
মারিও কার্নেরিও

4
আন্দ্রি এবং @ মারিও আপনি উভয়ই সঠিক এবং ভুল। প্রথম উদাহরণে, ফাইল-রিডারটি রিসোর্স লজিক দ্বারা বন্ধ করা হয়নি closed তবে যখন বাফার্ডারীডারটি বন্ধ হয়ে যাবে তখন এটি মোড়ানো ফাইলেরিডারটিও বন্ধ করে দেবে। প্রমাণের জন্য, java.io.FufferedReader.close () এর উত্সটি দেখুন। ফলস্বরূপ, প্রথম উদাহরণ থেকে কোডটি অগ্রাধিকার দেওয়া উচিত, কারণ এটি আরও সংক্ষিপ্ত।
jschreiner

7
@ জেএসক্রেইনার সত্য, যদিও আন্দ্রি-র (কিছুটা স্বীকৃত) ইস্যু যার sz < 0ফলে নির্মাতা একটি ব্যতিক্রম ছুঁড়ে ফেলবে, প্রকৃতপক্ষে রিসোর্স ফাঁস হওয়ার কারণ হবে।
মারিও কার্নেরিও

4
@ আমারিও আমি একমত বাইরের কনস্ট্রাক্টর ব্যর্থ হতে পারে এবং অভ্যন্তরীণ সংস্থানটি ফাঁস হয়ে যাবে। আমি এর আগে দেখিনি, ধন্যবাদ।
jschreiner
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.