জাভা ক্যাচ চেষ্টা করুন অবশেষে ক্যাচ ছাড়াই ব্লক


125

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



25
@ এমপি প্রত্যেকেরই কোড পর্যালোচনা করা উচিত এবং তাদের কাছ থেকে প্রশ্ন জিজ্ঞাসা করা হয় কীভাবে শিখতে ও উন্নত করা যায়।
কার্ল প্রিচেট

উত্তর:


130

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

শেষ পর্যন্ত ব্লকটি সর্বদা কার্যকর করা হয়, ব্যতিক্রম ছুঁড়ে ফেলা হোক বা না হোক।


11
প্রথম অনুচ্ছেদটি অগত্যা সত্য নয়। ব্লক নেস্ট করা যেতে পারে চেষ্টা করুন। যেকোন অপ্রকাশিত ব্যতিক্রম, যাচাই করা আছে বা না, পদ্ধতিটি ছাড়িয়ে যাবে।
অ্যান্ডি টমাস

4
ব্লকগুলি বাসা বাঁধতে পারে চেষ্টা করুন, তবে আমি এটির প্রস্তাব দেব না। আমি কোডটি সেভাবে লিখি না।
duffymo

2
@ ডিফাইমো: "পদ্ধতিতে বুদবুদ" অর্থ কী?
আজ প্রকাশিত 4

5
@ একটি ব্যতিক্রম ছোঁড়ার জন্য @ কিছুটা সামান্য কিছু প্রযুক্তিগত ভাষাও।
duffymo

2
উপেক্ষা করা হয়নি; পদ্ধতি চেইন পাস।
duffymo

93

try/ এ একটি ছোট নোট finally: অবশেষে সর্বদা কার্যকর করা হবে unless

  • System.exit() বলা হয়.
  • জেভিএম ক্র্যাশ করেছে।
  • try{}ব্লক শেষ হয় না (যেমন অবিরাম লুপ)।

4
কি হবে try{..} catch{ throw ..} finally{..}? আমি মনে করি অবশেষে মৃত্যুদন্ড কার্যকর করা হবে না
sbeliakov

10
সেক্ষেত্রে অবশেষে এখনও ডাকা হবে। শুধুমাত্র মূল ব্যতিক্রম হারিয়েছে।
পিটার লরে

আপনি যদি আগে System.exit () কল করেন তবে শেষ পর্যন্ত মৃত্যুদন্ড কার্যকর করা হবে না।
মিমিরআর

2
@ জাইউইউ উপরের তালিকার প্রথম আইটেমটিই আমি এটি বোঝাতে চাইছি।
পিটার লরে

আমার বলতে হবে, এটি সমস্ত ঘাঁটি জুড়ে!
অস্কার ব্রাভো

39

জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন (1) কীভাবে try-catch-finallyকার্যকর করা হয় তা বর্ণনা করে । কোনও ধরা না থাকা প্রদত্ত থ্রোয়েবলকে ধরতে সক্ষম না হওয়ার সমতুল্য।

  • যদি ভ্যালু ভি এর একটি ছোঁড়ার কারণে চেষ্টা করে ব্লকটি কার্যকর করা হঠাৎ করেই সম্পূর্ণ হয়, তবে একটি পছন্দ আছে:
    • যদি রান-টাইম ধরণের ভি এর চেষ্টা করার স্টেটমেন্টের কোনও ক্যাচ ক্লজের প্যারামিটারে নির্ধারিত হয়, তবে
      ……
    • ট্রাই স্টেটমেন্টের কোনও ক্যাচ ক্লজের প্যারামিটারে রান-টাইম টাইপের ভি যদি নির্ধারিত না হয় তবে শেষ অবধি ব্লকটি কার্যকর করা হয় । তারপরে একটি পছন্দ আছে:
      • যদি অবশেষে ব্লকটি স্বাভাবিকভাবে সম্পূর্ণ হয়, তবে ভ্যালু মানটি ফেলে দেওয়ার কারণে চেষ্টা স্টেটমেন্টটি হঠাৎ করেই সম্পূর্ণ হয় try
      • যদি অবশেষে ব্লকটি হঠাৎ করে এস এর কারণে সম্পূর্ণ হয়, তবে চেষ্টা স্টেটমেন্টটি এস কারণে হঠাৎ করেই সম্পূর্ণ হয় (এবং মান ভ্রোটি ফেলে দেওয়া এবং ভুলে যায়)।

(1) শেষ পর্যন্ত চেষ্টা-ধরা কার্যকর করা


16

বাইরের ব্লকের ব্যতিক্রমটি ছুঁড়ে ফেলার পূর্বে শেষ পর্যন্ত অভ্যন্তরীণটি কার্যকর করা হয়।

public class TryCatchFinally {

  public static void main(String[] args) throws Exception {

    try{
        System.out.println('A');
        try{
            System.out.println('B');
            throw new Exception("threw exception in B");
        }
        finally
        {
            System.out.println('X');
        }
        //any code here in the first try block 
        //is unreachable if an exception occurs in the second try block
    }
    catch(Exception e)
    {
        System.out.println('Y');
    }
    finally
    {
        System.out.println('Z');
    }
  }
}

ফলাফল স্বরূপ

A
B
X
Y
Z

6

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

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

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

ঘটনাক্রমে, চেষ্টা / শেষ অবধি রিসোর্স ম্যানেজমেন্টের জন্য করণীয় একটি সাধারণ বিষয়, যেহেতু জাভার কোনও ডেস্ট্রাক্টর নেই।

যেমন -

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

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

catch ( Exception e) ...  // doesn't really catch *all*, eh?

পরিবর্তে এটি করুন:

catch ( Throwable t) ...

কুৎসিত অংশের জন্য নীচে কার্লোস হুবার্গারের উত্তর দেখুন।
এমপিএলওয়ার্ক

3

সংস্করণ before এর আগে জাভা সংস্করণগুলি এই তিনটি সংমিশ্রণের জন্য শেষ পর্যন্ত চেষ্টা করার অনুমতি দেয় ...

try - catch
try - catch - finally
try - finally

finallyব্লকটি সর্বদা কার্যকর করা হবে tryবা / এবং catchব্লকটিতে কী চলছে তা বিবেচনা করেই । সুতরাং যদি কোনও catchব্লক না থাকে তবে ব্যতিক্রমগুলি এখানে পরিচালনা করা হবে না।

তবে, আপনার কোডটির কোথাও আপনার এখনও একটি ব্যতিক্রম হ্যান্ডলার প্রয়োজন হবে - আপনি যদি না চান তবে আপনার অ্যাপ্লিকেশন অবশ্যই অবশ্যই ক্র্যাশ হয়। এটি হ্যান্ডলারটি ঠিক কোথায় আপনার অ্যাপ্লিকেশনটির আর্কিটেকচারের উপর নির্ভর করে।

  • জাভা চেষ্টা ব্লক অবশ্যই ধরা বা শেষ অবধি ব্লক অনুসরণ করা উচিত।
  • প্রতিটি চেষ্টা ব্লকের জন্য শূন্য বা ততোধিক ক্যাচ ব্লক থাকতে পারে তবে অবশেষে কেবলমাত্র একটি ব্লক।
  • প্রোগ্রামটি প্রস্থান করা হলে (শেষ পর্যন্ত সিস্টেম.এক্সিটকে কল করে) বা মারাত্মক ত্রুটির ফলে প্রক্রিয়াটি বাতিল হয়ে যাওয়ার ফলে) শেষ অবধি কার্যকর করা হবে না।

1
"সংস্করণ 7 অনুমোদনের আগে" আপনি কী বোঝাচ্ছেন যে জাভা 7 এবং জাভা 8 এই তিনটি সংমিশ্রণের অনুমতি দেয় না? আমি সন্দেহ করি এটি আপনি যা বোঝাতে চেয়েছিলেন তবে এটি আপনার উত্তর থেকেই বোঝা যাচ্ছে।
লুডুভিজক

ট্রাই ব্লকে রিটার্নের স্টেটমেন্ট থাকলে শেষ অবধি কার্যকর করা হয়?
রাহুল যাদব

@ রাহুল হ্যাঁ, শেষ পর্যন্ত ডাকা হবে। সূত্র: stackoverflow.com/questions/65035/...
roottraveller

1
@ অ্যারন - ট্রান্স-উইথ রিসোর্সের জন্য নতুন সিনট্যাক্স যা স্বয়ংক্রিয়ভাবে কল কীওয়ার্ডের পরে প্যারেনের মধ্যে নির্মিত যে কোনও কিছুতে ক্লোজ () কল করে।
রোবপ্রোগ

2

যদি কোনও ব্যতিক্রম বা ছোঁড়া যায় এমন কোনও কিছুর মুখোমুখি হয় তবে চেষ্টা কীভাবে কাজ করে

ব্যতিক্রমটিকে অন্য কোনও ক্ষেত্রে যেমন ধরা পড়ে না তেমনভাবে ব্লক থেকে বাইরে ফেলে দেওয়া হয়।

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

ক্যাচ ব্লক এবং শেষ অবধি চেষ্টা ব্লকের অরথোগোনাল অংশ। আপনি উভয় বা উভয় থাকতে পারে। জাভা 7 এর সাহায্যে আপনি কোনওটিই পেতে সক্ষম হবেন!


1

আপনি কি এই প্রোগ্রাম দিয়ে চেষ্টা করে না? এটি শেষমেশ ব্লক এবং শেষ অবধি কার্যকর করবে, তবে, ব্যতিক্রমটি পরিচালনা করা হবে না। কিন্তু, সেই ব্যতিক্রমটি শেষ অবধি আটকে দেওয়া যায়!


1

চেষ্টা ব্লকটি সম্পূর্ণ হওয়ার পরে অবশেষে ব্লকটি কার্যকর করা হয়। যদি চেষ্টা ব্লকের ভিতরে কিছু ফেলে দেওয়া হয় যা শেষ অবধি ছেড়ে যায় তখন কার্যকর করা হয়।


0

tryব্লকের ভিতরে আমরা এমন কোড লিখি যা একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে। catchব্লক যেখানে আমরা ব্যতিক্রম হ্যান্ডেল। finallyব্লক সবসময় কোন ব্যাপার ব্যতিক্রম ঘটে থাকুক বা না থাকুক মৃত্যুদন্ড কার্যকর করা হয়।

এখন আমাদের যদি চেষ্টা-অবশেষে ব্লক-এর পরিবর্তে চেষ্টা-অবরুদ্ধ ব্লক থাকে তবে ব্যতিক্রমটি পরিচালনা করা হবে না এবং কন্ট্রোলের পরিবর্তে কন্ট্রোলের পরিবর্তে চেষ্টা ব্লকের পরে তা অবশেষে ব্লকে চলে যাবে। আমরা ব্যতিক্রম ছাড়া কিছুই করতে চাইলে আমরা চেষ্টা-অবরুদ্ধ ব্লকটি ব্যবহার করতে পারি।


0

নির্বিশেষে tryব্লকটিতে ছুঁড়ে ফেলে দেওয়া বা না করা - finallyব্লক কার্যকর করা হবে। ব্যতিক্রম ধরা পড়ত না।

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