জাভাতে কাস্টম ব্যতিক্রম ক্লাসটি কীভাবে সংজ্ঞায়িত করা যায়, সবচেয়ে সহজ উপায়?


286

আমি আমার ব্যাতিক্রম শ্রেণীর সহজতম উপায়টি সংজ্ঞায়নের চেষ্টা করছি এবং আমি এটিই পাচ্ছি:

public class MyException extends Exception {}

public class Foo {
  public bar() throws MyException {
    throw new MyException("try again please");
  }
}

এটি জাভা সংকলক বলে:

cannot find symbol: constructor MyException(java.lang.String)

আমার মনে হয়েছিল যে এই নির্মাণকারীর উত্তরাধিকার সূত্রে প্রাপ্ত হতে হবে java.lang.Exception, তাই না?

উত্তর:


402

না, আপনি অ-ডিফল্ট নির্মাতাদের "উত্তরাধিকারী" করেন না, আপনার ক্লাসে স্ট্রিং নেওয়া একজনকে আপনার অবশ্যই সংজ্ঞা দেওয়া দরকার। সাধারণত আপনি super(message)আপনার পিতামাতার কনস্ট্রাক্টরকে অনুরোধ করতে আপনার নির্মাণকারী ব্যবহার করেন in উদাহরণস্বরূপ, এটি পছন্দ করুন:

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

58
@ ভলকানিনো: না। প্রতিটি শ্রেণীর জন্য সংকলক ডিফল্ট কনস্ট্রাক্টর যুক্ত করে যা তার নিজস্ব কোনও নির্মাণকারীর সংজ্ঞা দেয় না। আপনি যদি একটি সুস্পষ্ট কনস্ট্রাক্টর সংজ্ঞায়িত করেন তবে সুপারক্লাসটি থাকা সত্ত্বেও আপনি ডিফল্টটি পাবেন না এবং যদি আপনার ক্লাসে কোনও কনস্ট্রাক্টর না থাকে, আপনি সুপারক্লাস না থাকলেও আপনি ডিফল্ট পাবেন।
মাইকেল বর্গওয়ার্ট

5
if your class has no constructor, you get the default even if the superclass does not have itশেষ অংশটি অসম্ভব, যদি না সুপারক্লাসে একটি ডিফল্ট নির্মাতা থাকে যা এই শ্রেণীর অ্যাক্সেসযোগ্য (সুরক্ষিত বা প্যাকেজ-সুরক্ষিত) হতে পারে। অন্যথায় আপনাকে অবশ্যই পিতামাতাদের একজনকে অবশ্যই স্পষ্টভাবে কল করতে হবে, বা সংকলন ব্যর্থ হবে।
শন প্যাট্রিক ফ্লয়েড

43
ব্যতিক্রমগুলি শৃঙ্খলাবদ্ধভাবে যথাযথভাবে সমর্থন করার জন্য দয়া করে MyException(Throwable)এবং MyException(String, Throwable)নির্মাণকারীদের যুক্ত করুন ।
ড্যানিলো পিয়াজলুঙ্গা

8
প্রায় 3 বছর পরে এবং অতিরিক্ত নির্মাণকারীর কোনও যোগ করা হয়নি। :(
বাইসোর

2
@ ব্র্যান্ডনআইবটসন 'তারা' বলতে কী বোঝায় এবং তারা কোথায় যুক্ত হয়? আপনি যদি তাদের বোঝাতে চেয়েছিলেন তবে তারা সুপারক্লাস নির্মাণকারী এবং 'যেখানে' সাবক্লাস ব্যবহার করে তবে আপনি ভুল are সুপারক্লাস নির্মাতারা সাবক্লাসে সুস্পষ্টভাবে যুক্ত হয় না। প্লাস আমি এই শব্দগুলির রেফারেন্স দেওয়ার জন্য পূর্ববর্তী বাক্যগুলিতে অন্য কোনও বিষয় দেখতে পাচ্ছি না।
হালিল

90

একটি সাধারণ কাস্টম ব্যতিক্রম আমি সংজ্ঞায়িত করব এরকম কিছু:

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable throwable) {
        super(message, throwable);
    }

}

আমি এমনকি Eclipse ব্যবহার করে একটি টেম্পলেট তৈরি করেছি যাতে আমাকে সমস্ত জিনিস বারবার লিখতে হবে না।


17
Eclipse এ আপনার ক্লাস তৈরি করার সময় আপনি কেবল ব্যতিক্রম প্রসারিত করতে পারেন এবং আপনি চারটি কনস্ট্রাক্টর পাবেন। আপনার কোনও টেম্পলেট দরকার নেই।
jeremyjjbrown

আমাদের প্রথম ব্যবহারকারীর পরিবর্তে দ্বিতীয় কনসট্রাক্টর কখন ব্যবহার করা উচিত?
ZhaoGang

61

আপনি যদি Eclipse এ নতুন শ্রেণীর কথোপকথনটি ব্যবহার করেন তবে আপনি সুপার সুপারগ্লাস ফিল্ডটি কেবল java.lang.Exception"সুপারক্লাস থেকে নির্মাণকারী" এ সেট করতে পারেন এবং এটি নিম্নলিখিতটি তৈরি করতে পারে:

package com.example.exception;

public class MyException extends Exception {

    public MyException() {
        // TODO Auto-generated constructor stub
    }

    public MyException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    public MyException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

}

super()ডিফল্ট কনস্ট্রাক্টরকে ফোন না করার বিষয়ে নীচের প্রশ্নের জবাবে , ওরাকল এর এই কথাটি বলে :

দ্রষ্টব্য: যদি কোনও নির্মাণকারী সুস্পষ্টভাবে একটি সুপারক্লাস নির্মাণকারীকে না ডাকে, জাভা সংকলক স্বয়ংক্রিয়ভাবে সুপারক্লাসের নো-আর্গুমেন্ট নির্মাণকারীকে একটি কল প্রবেশ করিয়ে দেয়।


1
ডিফল্ট কনস্ট্রাক্টরের কল করার জন্য এটি কেন প্রয়োজন হয় না super()?
সিলিং


22

এর কারণটি জাভা প্ল্যাটফর্মের উত্তরাধিকার নিবন্ধে ব্যাখ্যা করা হয়েছে যা বলে:

"একজন উপশ্রেণী উত্তরাধিকারী সকল সদস্যদের তার সুপারক্লাস থেকে (ক্ষেত্র, পদ্ধতি, এবং নেস্টেড শ্রেণীর)। কন্সট্রাকটর সদস্য নয় তাই তারা উপশ্রেণী দ্বারা উত্তরাধিকার সুত্রে প্রাপ্ত হয় না, কিন্তু সুপারক্লাস প্রস্ততকর্তার উপশ্রেণী থেকে আহ্বান করা যেতে পারে।"


19
package customExceptions;

public class MyException extends Exception{

    public MyException(String exc)
    {
        super(exc);
    }
    public String getMessage()
    {
        return super.getMessage();
    }
}

import customExceptions.MyException;

public class UseCustomException {

    MyException newExc=new MyException("This is a custom exception");

    public UseCustomException() throws MyException
    {
        System.out.println("Hello Back Again with custom exception");
        throw newExc;       
}

    public static void main(String args[])
    {
        try
        {
            UseCustomException use=new UseCustomException();
        }
        catch(MyException myEx)
        {
            System.out.println("This is my custom exception:" + myEx.getMessage());
        }
    }
}

এই ফিরে কি হবে?
ব্যবহারকারী 1876508

এটি কেবল "কাস্টম ব্যতিক্রমের সাথে হ্যালো ব্যাক অ্যাগেইন" প্রিন্ট করবে যা ইউজকসম এক্সপ্লেশনের কনস্ট্রাক্টর থেকে এসেছে, ব্যতিক্রমটি নিক্ষেপ করা হবে তবে মূলটিকে ধরা হবে যা "এটি আমার কাস্টম ব্যতিক্রম: এটি একটি কাস্টম ব্যতিক্রম"।
দ্য পারসন

2

ব্যতিক্রম শ্রেণিতে দুটি কনস্ট্রাক্টর রয়েছে

  • public Exception() - এটি কোনও অতিরিক্ত তথ্য ছাড়াই একটি ব্যতিক্রম গঠন করে the ব্যতিক্রমের প্রকৃতিটি সাধারণত শ্রেণীর নাম থেকে অনুমান করা হয়।
  • public Exception(String s) - নির্দিষ্ট ত্রুটি বার্তা সহ একটি ব্যতিক্রম তৈরি করে A একটি বিস্তারিত বার্তা একটি স্ট্রিং যা এই বিশেষ ব্যতিক্রমের জন্য ত্রুটির শর্তটি বর্ণনা করে।

3
প্রকৃতপক্ষে, জাভা 1.4 সাল থেকে, আরও দুটি নির্মাতা রয়েছে: public Exception(Throwable)এবং public Exception(String, Throwable)চেইন ব্যতিক্রমগুলি যথাযথভাবে সমর্থন করার জন্য তাদের প্রয়োজন ।
ড্যানিলো পিয়াজালুঙ্গা

@ ড্যানিলোপিয়াজালুঙ্গা আপনার সাথে একমত উত্স: কনস্ট্রাক্টর সংক্ষিপ্ত বিবরণ ডকস.অরাকল.com
কেএনইউ ২:5

0

আপনি যদি ব্যতিক্রম থেকে উত্তরাধিকারী হন তবে আপনাকে এমন একটি কনস্ট্রাক্টর সরবরাহ করতে হবে যা স্ট্রিংকে প্যারামিটার হিসাবে গ্রহণ করবে (এতে ত্রুটির বার্তা থাকবে)।


আমি মনে করি আপনার যুক্তিও যুক্ত করা উচিত।
জিগার জোশী

3
আসলে, এটি ভুল। যদি আপনার কোড কোনও স্ট্রিং আর্গুমেন্ট সহ কোনও কনস্ট্রাক্টর ব্যবহার করে তবে আপনাকে এটি ঘোষণা করতে হবে। যাইহোক, একটি ব্যতিক্রম উপশ্রেণী করতে কোন স্পষ্ট কনস্ট্রাকটর সঙ্গে সংজ্ঞায়িত করা ... কারন ব্যতিক্রম একটি নো args কন্সট্রাকটর হয়েছে।
স্টিফেন সি

0

এবং একটি ব্যতিক্রম নিক্ষেপ করার সহজ উপায়টি ভুলে যাবেন না (আপনার কোনও শ্রেণি তৈরি করার দরকার নেই)

if (rgb > MAX) throw new RuntimeException("max color exceeded");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.