E.getMessage () এবং e.getLocalizedMessage () এর মধ্যে পার্থক্য


85
  • আমি ত্রুটি পরিচালনার সময় ক্যাপ ব্লক দ্বারা বার্তাটি ছুঁড়ে ফেলার জন্য এই দুটি পদ্ধতি ব্যবহার করছি
  • এই দু'জনেই ত্রুটি পরিচালনার মাধ্যমে আমাকে বার্তাটি পেয়েছে তবে এই দু'জনের সাথে ঠিক কী পার্থক্য রয়েছে
  • আমি ইন্টারনেট থেকে কিছু অনুসন্ধান করেছি এবং এখান থেকে এই উত্তরটি নিয়ে এসেছি

জাভা ব্যতিক্রমগুলি থ্রোয়েবলের কাছ থেকে তাদের getMessage এবং getLocalizedMessage পদ্ধতি উত্তরাধিকার সূত্রে উত্তরাধিকার সূত্রে প্রাপ্ত (সম্পর্কিত লিঙ্কটি দেখুন)। পার্থক্যটি হ'ল সাবক্লাসগুলি লোকেল-নির্দিষ্ট বার্তা সরবরাহের জন্য getLocalizedMessage ওভাররাইড করে। উদাহরণস্বরূপ, এমন একটি চিত্র যা আপনি আমেরিকান-ইংলিশ স্পিকিং সংস্থা / গোষ্ঠী থেকে ব্রিটিশ-ইংলিশ গ্রুপে কোডটি মানিয়ে নিচ্ছেন ima আপনি আপনার কাস্টম এক্সেপশন ক্লাস তৈরি করতে চাইতে পারেন যা আপনার কোড ব্যবহার করছে এমন ব্যবহারকারী এবং বিকাশকারীরা কী আশা করতে পারে তার বানান এবং ব্যাকরণ সংশোধন করার জন্য getLocalizedMessage ওভাররাইড করে। এটি ব্যতিক্রম বার্তাগুলির প্রকৃত অনুবাদগুলির জন্যও ব্যবহার করা যেতে পারে।


প্রশ্ন ::

  • তার মানে কি language specificবাস্তবায়ন? যেমন আমি e.getLocalizedMessage()উদাহরণ হিসাবে আমার অ্যাপ্লিকেশনটি ব্যবহার করি English- ত্রুটি নিক্ষেপ করা হবে English, যদি আমি আমার অ্যাপ্লিকেশনটি ব্যবহার করি Spanish- তবে ত্রুটিটি নিক্ষিপ্ত হবেSpanish

  • আমি কখন এই পদ্ধতিগুলি আমার ব্যবহারে ব্যবহার করতে পারি তার কিছু স্পষ্ট ব্যাখ্যা দরকার


4
হ্যাঁ, এর অর্থ লোকাল (ভাষা, সংস্কৃতি) নির্দিষ্ট প্রয়োগকরণ। অফিসিয়াল ডকুমেন্টেশনে কী সমস্যা ?
ডিফল্ট লোকেল

উত্তর:


72

সবাই যেমন উপরে উল্লিখিত হয়েছে -

আমার বোঝার জন্য, getMessage()ব্যতিক্রমটির নাম ফিরিয়ে দেয়। getLocalizedMessage()ব্যবহারকারীর স্থানীয় ভাষায় (চাইনিজ, জাপানি ইত্যাদি) ব্যতিক্রমটির নাম দেয়। এই কাজটি করার জন্য, আপনি যে ক্লাসে কল getLocalizedMessage()করছেন সেটিকে অবশ্যই ওভাররাইড করা উচিতgetLocalizedMessage() পদ্ধতিটি । যদি এটি না হয় তবে এর সুপার ক্লাসগুলির একটির পদ্ধতিটিকে বলা হয় যা ডিফল্টরূপে কেবল getMessage এর ফলাফল প্রদান করে।

এটির পাশাপাশি, আমি কীভাবে এটি ব্যবহার করব তা ব্যাখ্যা করে কিছু কোড সেগমেন্ট রাখতে চাই।

এটি কিভাবে ব্যবহার করতে

জাভা যাদুকর কিছুই করে না, তবে এটি আমাদের জীবনকে আরও সহজ করার উপায় সরবরাহ করে। getLocalizedMessage()কার্যকরভাবে ব্যবহার করতে , আমাদের ডিফল্ট আচরণটি ওভাররাইড করতে হবে।

import java.util.ResourceBundle;

public class MyLocalizedThrowable extends Throwable {

    ResourceBundle labels = ResourceBundle.getBundle("loc.exc.test.message");

    private static final long serialVersionUID = 1L;
    public MyLocalizedThrowable(String messageKey) {
        super(messageKey);
    }

    public String getLocalizedMessage() {
        return labels.getString(getMessage());
    }
}

java.util.ResourceBundle স্থানীয়করণ করতে ব্যবহৃত হয়।

এই উদাহরণে, আপনাকে ভাষা-নির্দিষ্ট সম্পত্তি ফাইলগুলিতে রাখতে হবে loc/exc/test । উদাহরণ স্বরূপ:

message_fr.properties (কিছু কী এবং মান রয়েছে):

key1=this is key one in France

message.properties (কিছু কী এবং মান সহ):

key1=this is key one in English

এখন, ধরে নেওয়া যাক আমাদের ব্যতিক্রম জেনারেটর বর্গটি এরকম কিছু

public class ExceptionGenerator {

    public void generateException() throws MyLocalizedThrowable {
        throw new MyLocalizedThrowable("key1");
    }
}

এবং প্রধান শ্রেণিটি হ'ল:

public static void main(String[] args) {
    //Locale.setDefault(Locale.FRANCE);
    ExceptionGenerator eg = new ExceptionGenerator();

    try {
        eg.generateException();
    } catch (MyLocalizedThrowable e) {
        System.out.println(e.getLocalizedMessage());
    }
}

ডিফল্টরূপে, যদি আপনি "ইংরাজী" পরিবেশে নির্বাহ করছেন তবে এটি "ইংরেজি" কী মানটি ফিরিয়ে দেবে। আপনি যদি স্থানীয়কে ফ্রান্সে সেট করেন তবে আপনি বার্তা_ফাইআর ফাইল থেকে আউটপুট পাবেন।

কখন এটি ব্যবহার করবেন

যদি আপনার অ্যাপ্লিকেশনটির l10n / i18n সমর্থন করা দরকার হয় তবে আপনাকে এটি ব্যবহার করা দরকার। তবে বেশিরভাগ অ্যাপ্লিকেশনটির প্রয়োজন হয় না, কারণ বেশিরভাগ ত্রুটি বার্তাগুলি শেষ গ্রাহকের জন্য নয়, তবে সমর্থন ইঞ্জিনিয়ার / উন্নয়ন প্রকৌশলের জন্য।


6
"আমার বোঝার জন্য, getMessage () ব্যতিক্রমটির নাম ফিরিয়ে দেয় returns" এটা ঠিক ভুল। ব্যতিক্রমটির নামটি পাওয়া গেছে e.getClass().getSimpleName()new NullPointerException().getMessage()"নাল" প্রদান করে, "নালপয়েন্টারএক্সসেপশন" নয়।
ফিলিপ হোয়াইটহাউস

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

6

এটি সত্যিই অবাক করা - থ্রোয়েবল.জাভা ক্লাসের ওপেনজেডকে 7 কোডটি পরীক্ষা করে দেখুন ।

এর বাস্তবায়ন getLocalizedMessageহ'ল -

390     public String getLocalizedMessage() {
391         return getMessage();
392     }

এবং এর বাস্তবায়ন getMessageহ'ল -

376     public String getMessage() {
377         return detailMessage;
378     }

এবং

130     private String detailMessage;

উভয় পদ্ধতির প্রয়োগের পরিবর্তে ডকুমেন্টেশন নেই is


15
ডকুমেন্টেশনে স্পষ্টভাবে বলা হয়েছে "স্থানীয়-নির্দিষ্ট বার্তা তৈরি করতে সাবক্লাসগুলি এই পদ্ধতিটি ওভাররাইড করতে পারে sub এই পদ্ধতিটি ওভাররাইড না করে এমন সাবক্লাসগুলির জন্য, ডিফল্ট বাস্তবায়ন getMessage () হিসাবে একই ফলাফল দেয়" "
বোকা 4 ই জেসুস

2

না এটি অবশ্যই ভাষা নির্দিষ্ট বাস্তবায়ন বোঝায় না। এর অর্থ এমন বাস্তবায়ন যা আন্তর্জাতিককরণ (ওরফে আই 18 এন) প্রক্রিয়া ব্যবহার করে। দেখতে এই পৃষ্ঠার এবং কি রিসোর্স থোকায় থোকায় হয় আরো বিস্তারিত জানার কিভাবে তাদের ব্যবহার করতে পারে।

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

কখন এবং কোথায় এটি ব্যবহৃত হয় তা সম্পূর্ণরূপে আপনার। সাধারণত আপনি কেবল তখনই উদ্বিগ্ন থাকবেন যখন আপনি কোনও অ প্রযুক্তিগত ব্যবহারকারীর কাছে ব্যতিক্রম উপস্থাপন করতে চান, যিনি ইংরেজি ভাল জানেন না। সুতরাং উদাহরণস্বরূপ, যদি আপনি কেবল লগ করার জন্য লিখছেন (যা সাধারণত কেবল প্রযুক্তিগত ব্যবহারকারীরা পড়ে থাকেন এবং তাই সাধারণ আই 18 এন টার্গেট না থাকে):

try {
   somethingDangerous();
} catch (Exception e) {
   log.error("got this: "+e.getMessage());
}

তবে যদি আপনি পর্দায় ব্যতিক্রম বার্তাটি প্রদর্শন করতে চান (উদাহরণস্বরূপ একটি ছোট কথোপকথন) তবে আপনি বার্তাটি স্থানীয় ভাষায় প্রদর্শন করতে চাইতে পারেন:

try {
   somethingDangerous();
} catch (Exception e) {
   JOptionPane.showMessageDialog(frame,
    e.getLocalizedMessage(),
    "Error",  <---- also best be taken from i18n
    JOptionPane.ERROR_MESSAGE);
}

2
public String  getMessage() 

এই নিক্ষেপযোগ্যটির বিশদ বার্তার স্ট্রিংটি ফিরিয়ে দেয়।

public String getLocalizedMessage() 

এই নিক্ষেপযোগ্য একটি স্থানীয় বিবরণ তৈরি করে। স্থানীয়-নির্দিষ্ট বার্তা তৈরি করতে সাবক্লাসগুলি এই পদ্ধতিটি ওভাররাইড করতে পারে। এই পদ্ধতিটিকে ওভাররাইড না করে এমন সাবক্লাসগুলির জন্য, ডিফল্ট বাস্তবায়ন একই ফলাফলটি প্রদান করে getMessage()

আপনার ক্ষেত্রে ই ব্যতিক্রমের বিষয় ছাড়া আর কিছুই নয় ...

getLocalizedMessage() আপনাকে নিজের বার্তাটি ওভাররাইড করে দিতে হবে অর্থাৎ স্থানীয় বার্তার জন্য অর্থ।

উদাহরণস্বরূপ ... যদি কোনও নাল পয়েন্টার ব্যতিক্রম থাকে ...

মুদ্রণ এবং এটি নাল প্রদর্শন করবে

e.getMessage() ---> NullPointerException

2

থ্রোয়েবল.জভা ক্লাসের এটিই বলতে হবে। হতে পারে এটি কাউকে সাহায্য করতে পারে:

/**
 * Returns the detail message string of this throwable.
 *
 * @return  the detail message string of this {@code Throwable} instance
 *          (which may be {@code null}).
 */
public String getMessage() {
    return detailMessage;
}

/**
 * Creates a localized description of this throwable.
 * Subclasses may override this method in order to produce a
 * locale-specific message.  For subclasses that do not override this
 * method, the default implementation returns the same result as
 * {@code getMessage()}.
 *
 * @return  The localized description of this throwable.
 * @since   JDK1.1
 */
public String getLocalizedMessage() {
    return getMessage();
}

-2

আমার বোঝার জন্য, getMessage ব্যতিক্রমটির নাম ফিরিয়ে দেয়। getLocalizedMessage ব্যবহারকারীর স্থানীয় ভাষায় (চাইনিজ, জাপানি ইত্যাদি) ব্যতিক্রমটির নাম দেয়। এই কাজটি করার জন্য, আপনি যে শ্রেণীর উপর getLocalizedMessage কল করছেন তাতে অবশ্যই getLocalizedMessage পদ্ধতিটি ওভাররাইড করা উচিত। যদি এটি না হয় তবে এর সুপার ক্লাসগুলির একটির পদ্ধতিটিকে বলা হয় যা ডিফল্টরূপে কেবল getMessage এর ফলাফল দেয়।

সুতরাং বেশিরভাগ ক্ষেত্রে, ফলাফল একই হবে তবে কিছু ক্ষেত্রে এটি প্রোগ্রামটি যে অঞ্চলে চলছে তার ভাষায় ব্যতিক্রম নামটি ফিরিয়ে দেবে।

এর অর্থ কি ভাষা নির্দিষ্ট বাস্তবায়ন? যেমন আমি e.getLocalizedMessage ব্যবহার করি () উদাহরণস্বরূপ ইংরেজিতে আমার অ্যাপ্লিকেশন - ত্রুটি ইংরেজীতে নিক্ষেপ করা হবে, যদি আমি স্প্যানিশ ভাষায় আমার অ্যাপ্লিকেশন ব্যবহার করি - তবে ত্রুটি স্প্যানিশ ভাষায় নিক্ষিপ্ত হবে

public String 
getMessage() 

Returns the detail message string of this throwable.





public String 
getLocalizedMessage() 

এই নিক্ষেপযোগ্য একটি স্থানীয় বিবরণ তৈরি করে। স্থানীয়-নির্দিষ্ট বার্তা তৈরি করতে সাবক্লাসগুলি এই পদ্ধতিটি ওভাররাইড করতে পারে। এই পদ্ধতিটিকে ওভাররাইড না করে এমন সাবক্লাসগুলির জন্য, ডিফল্ট বাস্তবায়ন getMessage () হিসাবে একই ফলাফল দেয়।

আপনার ক্ষেত্রে ই ব্যতিক্রমের বিষয় ছাড়া আর কিছুই নয় ...

getLocalizedMessage() u need to override and give your own message i.e 
the meaning for localized message. 

উদাহরণস্বরূপ ... যদি কোনও নাল পয়েন্টার ব্যতিক্রম থাকে ...

মুদ্রণ এবং এটি নাল প্রদর্শন করবে

e.getMessage() ---> NullPointerException 

আরও পড়ুন ...


-2

আমার বোঝার জন্য, getMessageব্যতিক্রমটির নাম ফিরিয়ে দেয়।

getLocalizedMessage ব্যবহারকারীর স্থানীয় ভাষায় (চাইনিজ, জাপানি ইত্যাদি) ব্যতিক্রমটির নাম দেয়।

এই কাজটি করার জন্য, আপনি যে ক্লাসে কল getLocalizedMessageকরছেন তার অবশ্যই getLocalizedMessageপদ্ধতিটি ওভাররাইড করা উচিত ।

যদি এটি না হয় তবে এর একটি সুপার ক্লাসের পদ্ধতিটিকে বলা হয় যা ডিফল্টভাবে কেবল ফলাফলের ফলাফল দেয় getMessage

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