জাভাতে কাস্টম ব্যতিক্রম কীভাবে তৈরি করবেন? [বন্ধ]


149

আমরা জাভাতে কীভাবে কাস্টম ব্যতিক্রম তৈরি করব?


2
এটি বেশিরভাগ ওও ভাষায় ব্যবহৃত একই পদ্ধতি: বেস ব্যাতিক্রম শ্রেণীর প্রসারিত করুন।
এনডিএম

2
পরীক্ষা করে দেখুন stackoverflow.com/questions/1070590/...
demongolem

1) // ক্লাস যা ব্যবহার-সংজ্ঞায়িত এক্সপসেশন ক্লাসের প্রতিনিধিত্ব করে MyException প্রসারিত ception সর্বজনীন MyException (স্ট্রিং)) সুপার (গুলি); }} ------------------------------------------------------ 2) চেষ্টা করুন {// ব্যবহারকারীর সংজ্ঞায়িত ব্যতিক্রমের একটি বস্তুকে নিক্ষেপ করুন নতুন মাইএক্সেপশন ("টেস্টএক্সেপশন"); } ধরা (MyException প্রাক্তন)) System.out.println ("ধরা"); // মাইএক্সেপশন অবজেক্টটি থেকে বার্তাটি মুদ্রণ করুন System.out.println (ex.getMessage ()); }
মনদীপ যাদব

উত্তর:


285

একটি চেক করা ব্যতিক্রম সংজ্ঞায়িত করতে আপনি একটি সাবক্লাস তৈরি করেন (বা সাবক্লাসের শ্রেণিবিন্যাস) java.lang.Exception। উদাহরণ স্বরূপ:

public class FooException extends Exception {
  public FooException() { super(); }
  public FooException(String message) { super(message); }
  public FooException(String message, Throwable cause) { super(message, cause); }
  public FooException(Throwable cause) { super(cause); }
}

এই ব্যতিক্রমগুলি সম্ভাব্যভাবে ছোঁড়া বা প্রচার করতে পারে এমন পদ্ধতিগুলি অবশ্যই এটি ঘোষণা করতে হবে:

public void calculate(int i) throws FooException, IOException;

... এবং কোডটিকে এই পদ্ধতিতে কল করার জন্য অবশ্যই এই ব্যতিক্রমটি হ্যান্ডেল করা বা প্রচার করা উচিত (বা উভয়):

try {
  int i = 5;
  myObject.calculate(5);
} catch(FooException ex) {
  // Print error and terminate application.
  ex.printStackTrace();
  System.exit(1);
} catch(IOException ex) {
  // Rethrow as FooException.
  throw new FooException(ex);
}

আপনি উপরোক্ত উদাহরণে লক্ষ্য করবেন IOExceptionযা ধরা পড়ে এবং পুনরায় উত্থিত হয় FooException। এটি একটি সাধারণ কৌশল যা ব্যতিক্রমগুলি encapsulate করতে ব্যবহৃত হয় (সাধারণত কোনও এপিআই প্রয়োগ করার সময়)।

কখনও কখনও এমন পরিস্থিতি তৈরি হয় যেখানে আপনি প্রতিটি পদ্ধতিটিকে তার আপত্তি প্রয়োগের ঘোষণা দিতে বাধ্য করতে চান না rows এই ক্ষেত্রে আপনি একটি তৈরি করতে পারেন অবারিত ব্যতিক্রম। একটি চেক না করা ব্যতিক্রম হ'ল যে ব্যতিক্রমগুলি প্রসারিত java.lang.RuntimeException(যা নিজেই এটির একটি সাবক্লাস java.lang.Exception):

public class FooRuntimeException extends RuntimeException {
  ...
}

পদ্ধতিগুলি FooRuntimeExceptionএটি ঘোষণা না করে ব্যতিক্রম ছোঁড়া বা প্রচার করতে পারে; যেমন

public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}

চেক করা ব্যতিক্রমগুলি সাধারণত একটি প্রোগ্রামার ত্রুটি বোঝাতে ব্যবহৃত হয়, উদাহরণস্বরূপ কোনও পদ্ধতিতে একটি অবৈধ যুক্তি পাস করা বা অ্যারে সূচক সীমানাকে লঙ্ঘন করার চেষ্টা করা।

java.lang.Throwableবর্গ সব ত্রুটি এবং ব্যতিক্রম যে জাভা মধ্যে নিক্ষিপ্ত হতে পারে মূল। java.lang.Exceptionএবং java.lang.Errorউভয়ই এর সাবক্লাস Throwable। উপশ্রেণী যে কোনও কিছু Throwableনিক্ষেপ বা ধরা পড়তে পারে। তবে এটি ধরা বা নিক্ষেপ Errorকরা সাধারণত খারাপ অভ্যাস কারণ এটি JVM- র অভ্যন্তরীণ ত্রুটিগুলি বোঝাতে ব্যবহৃত হয় যা সাধারণত প্রোগ্রামার দ্বারা (যেমন OutOfMemoryError) পরিচালনা করা যায় না। তেমনি আপনার ধরাও এড়ানো উচিত Throwable, এর ফলে আপনি Errorএস ছাড়াও এস ধরতে পারেন Exception


25
public class MyException extends Exception {
        // special exception code goes here
}

এটিকে নিক্ষেপ করুন:

 throw new MyException ("Something happened")

হিসাবে ধরা:

catch (MyException e)
{
   // something
}

4

একটি পরীক্ষিত ব্যতিক্রম:

public class MyCustomException extends Exception { }

প্রযুক্তিগতভাবে, প্রসারিত যে কোনও কিছুই নিক্ষেপযোগ্য Throwableহতে পারে তবে ব্যতিক্রমগুলি সাধারণত Exceptionশ্রেণীর এক্সটেনশন হয় যাতে তারা ব্যতিক্রমগুলি পরীক্ষা করে নেওয়া হয় (রানটাইম এক্সেকশন বা এর উপর ভিত্তি করে ক্লাসগুলি যাচাই করা হয় না) অন্য সাধারণ ধরণের নিক্ষেপযোগ্য বিপরীতে, Errorগুলি যা সাধারণত জেভিএম ইন্টার্নালগুলি ছাড়িয়ে নিখুঁতভাবে পরিচালনার জন্য ডিজাইন করা কিছু নয়।

আপনি ব্যতিক্রমগুলি অ-সর্বজনীনও করতে পারেন, তবে তারপরে আপনি কেবল সেগুলি প্যাকেজে ব্যবহার করতে পারেন যা তাদের সংজ্ঞা দেয়, প্যাকেজগুলির বিপরীতে।

যতক্ষণ না কাস্টম ব্যতিক্রম ছোঁড়া / ধরা, এটি বিল্ট-ইনগুলির মতোই কাজ করে - এর মাধ্যমে ফেলে দিন

throw new MyCustomException()

এবং মাধ্যমে ধরা

catch (MyCustomException e) { }

4
রানটাইম এক্সেপশন ব্যতিক্রম প্রসারিত করে এবং এটি একটি চেক করা ব্যতিক্রম নয়।
অ্যাডামস্কি

2
প্রযুক্তিগতভাবে, প্রসারিত যে কোনও কিছু নিক্ষেপ করাThrowable যেতে পারে ; ব্যতিক্রম প্রসারিত । থ্রোয়েবলের একটি কাস্টম সাবক্লাস কোনও ব্লক ধরা পড়বে না । Exceptiontry { ... } catch (Exception e) { ... }
আন্দ্রেজেজ ডয়েল

লোকেরা কেন এই উত্তরটিকে সমর্থন করছে? এটিতে কয়েকটি অযোগ্যতা রয়েছে। 1) আপনি ইন্টারফেস হিসাবে নিক্ষেপযোগ্য implmenet করতে পারবেন না । 2) থ্রোয়েবলকে প্রসারিত যে কোনও কিছুই ব্যতিক্রম নয় ( Errorএটি ব্যতিক্রম নয়, এটি একটি ত্রুটি)। 3) এটি সূচিত করে যে ব্যতিক্রমগুলির যে কোনও সাবক্লাস পরীক্ষা করা হয় যখন রানটাইম এক্সেকশন হয় না। অ্যাডামস্কির দেওয়া উত্তরটি আরও অনেক নির্ভুল!
অক্সবো_লাক্স

ওফস - আমি বোঝাতে চাইছি নিক্ষেপযোগ্য কোনও ইন্টারফেস নয় !
অক্সবো_লাক্স

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