আমি কোডকে হোঁচট খেয়েছি এমন কিছু দেখাচ্ছে:
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যা কখনও নিক্ষেপ করা হয় না)।
-source 1.6পতাকাটি সংকলন প্রত্যাশার মতো সংকলন ত্রুটি উত্থাপন করে। উত্স সামঞ্জস্য 7 সঙ্গে সংকলন সংকলন ত্রুটি উত্থাপন করে না
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.
javac- আমি এমন একটি ক্ষেত্রে চলে আসছি যেখানে গ্রহগ্রাহের সংকলকটি আরও সুক্ষু ছিল।