একটি ব্যতিক্রম ধরা এবং এটি পুনর্বিবেচনা করা, তবে এটি ব্যতিক্রম নয়


10

আমি কোডকে হোঁচট খেয়েছি এমন কিছু দেখাচ্ছে:

void run() {
    try {
        doSomething();
    } catch (Exception ex) {
        System.out.println("Error: " + ex);
        throw ex;
    }
}

void doSomething() {
    throw new RuntimeException();
}

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

আমার প্রত্যাশাটি হ'ল আমাকে throws Exception- run()ধর্মাবলম্বীতে ঘোষণা করতে হবে ।

অতিরিক্ত তথ্য

ঠিক একই ভাবে, যদি doSomethingনিক্ষেপ করা ঘোষিত হয় IOExceptionতারপর শুধুমাত্র IOExceptionঘোষণা করা প্রয়োজন run()-method, যদিও Exceptionকট অ্যান্ড rethrown করা হয়।

void run() throws IOException {
    try {
        doSomething();
    } catch (Exception ex) {
        System.out.println("Error: " + ex);
        throw ex;
    }
}

void doSomething() throws IOException {
    // ... whatever code you may want ...
}

প্রশ্ন

জাভা সাধারণত পরিষ্কারতা পছন্দ করে, এই আচরণের পেছনের কারণ কী? সবসময় কি এরকম হয়েছে? জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনে কোনটি run()পদ্ধতিটির throws Exceptionউপরের কোড স্নিপেটগুলিতে ঘোষণা করার প্রয়োজন নেই ? (যদি আমি এটি যুক্ত করি তবে ইন্টেলিজি আমাকে সতর্ক করে Exceptionযা কখনও নিক্ষেপ করা হয় না)।


3
মজাদার. আপনি কোন সংকলক ব্যবহার করছেন? যদি এটি আইডিই সংকলক হয়, তারপরে পরীক্ষা করুন javac- আমি এমন একটি ক্ষেত্রে চলে আসছি যেখানে গ্রহগ্রাহের সংকলকটি আরও সুক্ষু ছিল।
এম

2
আমি এই আচরণটি ওপেনজেডকে -8 এ পুনরুত্পাদন করতে পারি। উল্লেখযোগ্যভাবে -source 1.6পতাকাটি সংকলন প্রত্যাশার মতো সংকলন ত্রুটি উত্থাপন করে। উত্স সামঞ্জস্য 7 সঙ্গে সংকলন সংকলন ত্রুটি উত্থাপন করে না
Vogel612

1
মনে হয় কম্পাইলার মত বুদ্ধিমতী জাভা 7 থেকে এবং প্রকৃত ব্যতিক্রম সম্পর্কে আরো চেক যে নিক্ষিপ্ত হতে পারে না।
মিচালক

2
এই প্রশ্নটির সদৃশ নয় এবং উত্তরটি আমি সরবরাহ করা লিঙ্কটিতে পাওয়া যাবেIn detail, in Java SE 7 and later, when you declare one or more exception types in a catch clause, and rethrow the exception handled by this catch block, the compiler verifies that the type of the rethrown exception meets the following conditions : 1. 1. The try block is able to throw it. 2. There are no other preceding catch blocks that can handle it. 3. It is a subtype or supertype of one of the catch clause's exception parameters.
মাইচাল্ক

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

উত্তর:


0

JLSআপনি আপনার প্রশ্নে যেমনটি জিজ্ঞাসা করেছেন আমি তেমন স্ক্যান করিনি , সুতরাং দয়া করে এই উত্তরটি লবণের দানা দিয়ে নিন। আমি এটি একটি মন্তব্য করতে চেয়েছিলেন, তবে এটি খুব বড় হত।


আমি মাঝে মাঝে মজার মনে করি, javacকিছু ক্ষেত্রে (আপনার ক্ষেত্রে যেমন) কীভাবে সুন্দর "স্মার্ট" হয় তবে পরে অন্যান্য বিষয়গুলি হ্যান্ডেল করার জন্য ছেড়ে যায় JIT। এই ক্ষেত্রে, এটি ঠিক যে সংকলকটি "বলতে পারে" যে কেবল একটি RuntimeExceptionধরা পড়ে। এটি সুস্পষ্ট, এটি কেবলমাত্র আপনিই ফেলে রাখেন doSomething। আপনি যদি নিজের কোডটি সামান্য পরিবর্তন করেন:

void run() {
    try {
        doSomething();
    } catch (Exception ex) {
        Exception ex2 = new Exception();
        System.out.println("Error: " + ex);
        throw ex2;
    }
}

আপনি একটি ভিন্ন আচরণ দেখতে পাবেন, কারণ এখনই javacবলতে পারেন Exceptionযে আপনি যে নিক্ষেপ করছেন তার সাথে একটি নতুন সম্পর্ক রয়েছে যা আপনি ধরা পড়েছিলেন to

তবে জিনিসগুলি আদর্শ থেকে অনেক দূরে, আপনি আবার কম্পাইলারটির মাধ্যমে "কৌশল" করতে পারেন:

void run() {
    try {
        doSomething();
    } catch (Exception ex) {
        Exception ex2 = new Exception();
        ex2 = ex;
        System.out.println("Error: " + ex);
        throw ex2;
    }
}

আইএমও, কারণ ex2 = ex;এটি আবার ব্যর্থ হওয়া উচিত নয়, তবে তা করে।

সেক্ষেত্রে এটি সংকলিত হয়েছিল javac 13+33


আমি কিছু লিঙ্কে পড়েছি যে কেউ সরবরাহ করেছে যে আপনি যদি ক্যাচ-ব্লকে ধরা পড়া ব্যতিক্রমটিকে পুনরায় সাইন করেন, তবে সংকলকটি স্মার্ট হতে সক্ষম নয়। আমি এই ক্ষেত্রে অনুরূপ কিছু প্রযোজ্য ধরে নিই। সংকলক জানে যে ex2ব্যতিক্রমটি নিক্ষেপ করা হবে, এটি মূলত একটি হিসাবে তৈরি হয়েছিল Exceptionতবে তারপরে পুনরায় নিয়োগ দেওয়া হয়েছে ex, এবং তাই সংকলকটি স্মার্ট হতে সক্ষম নয়।
সাইমন ফারসবার্গ

@ সিমোনফারসবার্গের এমন কেউ যার অনুরাগ রয়েছে যা JLSআসতে পারে এবং এটি প্রমাণ করার জন্য প্রয়োজনীয় উদ্ধৃতি সরবরাহ করে; দুর্ভাগ্যক্রমে আমি তাদের নেই।
ইউজিন

রেকর্ডের জন্য, যখন আমি ক্যাচ ব্লকটি পরিবর্তন করি তখন ধরা পড়া ব্যতিক্রমটির পুনরায় নিযুক্তকরণটি নিজের কাছে ( ex = ex;) রাখি , তখন হিউরিস্টিক আর প্রয়োগ হয় না। এই আচরণটি 7 থেকে 11 এবং সম্ভবত 13 এর সমস্ত উত্স স্তরের জন্য প্রয়োগ হয়েছে বলে মনে হচ্ছে
ভোগেল 612

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