E.getMessage () और e.getLocalizedMessage () के बीच अंतर


84
  • मैं त्रुटि से निपटने के दौरान कैच ब्लॉक द्वारा फेंके गए संदेश को प्राप्त करने के लिए इन दोनों विधियों का उपयोग कर रहा हूं
  • दोनों ने मुझे त्रुटि से संदेश प्राप्त किया, लेकिन इन दोनों के साथ वास्तव में क्या अलग है
  • मैंने इंटरनेट से कुछ खोज की और यहाँ से इस उत्तर के साथ आया

Java अपवादों को उनके getMessage और getLocalizedMessage विधियों को Throwable (संबंधित लिंक देखें) से विरासत में मिला है। अंतर यह है कि उपवर्गों को स्थानीय-विशिष्ट संदेश प्रदान करने के लिए getLocalizedMessage को ओवरराइड करना चाहिए। उदाहरण के लिए, इमेजिंग कि आप एक अमेरिकी-अंग्रेजी बोलने वाली कंपनी / समूह से एक ब्रिटिश-अंग्रेजी समूह के लिए कोड का अनुकूलन कर रहे हैं। आप कस्टम एक्सेप्शन क्लासेस बनाना चाहते हैं, जो वर्तनी और व्याकरण को सही करने के लिए getLocalizedMessage को ओवरराइड करता है, जो आपके कोड का उपयोग करने वाले उपयोगकर्ता और डेवलपर उम्मीद कर सकते हैं। इसका उपयोग अपवाद संदेशों के वास्तविक अनुवाद के लिए भी किया जा सकता है।


प्रश्न ::

  • क्या इसका मतलब language specificकार्यान्वयन है? जैसे अगर मैं का उपयोग e.getLocalizedMessage()उदाहरण में मेरे अनुप्रयोग के लिए English- त्रुटि में फेंक दिया जाएगा English, अगर मैं में मेरे एप्लिकेशन का उपयोग Spanish- तो त्रुटि में फेंक दिया जाएगाSpanish

  • मुझे इन तरीकों का उपयोग कहां और कब करना है, इस पर कुछ स्पष्ट स्पष्टीकरण की आवश्यकता है


1
हां, इसका मतलब स्थानीय (भाषा, संस्कृति) विशिष्ट कार्यान्वयन है। आधिकारिक दस्तावेज में क्या गलत है ?
डिफ़ॉल्ट लोक

जवाबों:


71

जैसा कि सभी ने ऊपर बताया है -

मेरी समझ से, getMessage()अपवाद का नाम देता है। getLocalizedMessage()उपयोगकर्ता (चीनी, जापानी आदि) की स्थानीय भाषा में अपवाद का नाम देता है। इस कार्य को करने के लिए, आप जिस वर्ग को बुला रहे हैं, उसने getLocalizedMessage()इस getLocalizedMessage()विधि को ओवरराइड किया होगा । यदि यह नहीं है, तो इसके सुपर क्लास में से एक की विधि को कहा जाता है, जो डिफ़ॉल्ट रूप से गेटमैसेज का परिणाम देता है।

इसके अलावा, मैं कुछ कोड सेगमेंट में यह बताना चाहूंगा कि इसका उपयोग कैसे किया जाए।

इसे कैसे उपयोग करे

जावा जादुई कुछ भी नहीं करता है, लेकिन यह हमारे जीवन को आसान बनाने का एक तरीका प्रदान करता है। 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 () अपवाद का नाम देता है।" यह सिर्फ गलत है। अपवाद के नाम से पाया जाता है e.getClass().getSimpleName()new NullPointerException().getMessage()"null" देता है, न कि "NullPointerException"।
फिलिप व्हाइटहाउस

हालांकि, यहां जाल यह है कि विधि वास्तव में लोकेल नहीं लेती है, इसलिए उपयोगकर्ता का लोकेल प्राप्त करना हमेशा संभव नहीं होता है। विशेष रूप से, इस उत्तर में अपवाद को जिस तरह से लागू किया गया है, वह केवल जीयूआई अनुप्रयोग के अपवाद को ठीक से स्थानीय करेगा। सर्वर-साइड एप्लिकेशन के लिए, JVM का डिफ़ॉल्ट लोकेल उपयोगकर्ता के समान नहीं है, इसलिए सर्वश्रेष्ठ नीति कभी रिसोर्सबंडल.गेटबंडल (स्ट्रिंग) को कॉल करने के लिए नहीं होती है और हमेशा उपयोगकर्ता के वास्तविक लोकेल प्रदान करने के लिए होती है। (उदाहरण के लिए, वेब एप्लिकेशन के साथ, आप आमतौर पर हेडर में उपयोगकर्ता के लोकेल के बारे में जानकारी प्राप्त करते हैं।)
ट्रेकज

6

यह वास्तव में आश्चर्य की बात है - Throwable.java वर्ग के ओपन जेडडीके 7 कोड की जांच करें

का कार्यान्वयन getLocalizedMessageहै -

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

और का कार्यान्वयन getMessageहै -

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

तथा

130     private String detailMessage;

दोनों विधि के दस्तावेज़ीकरण में कोई परिवर्तन नहीं है लेकिन प्रलेखन।


15
दस्तावेज़ में स्पष्ट रूप से कहा गया है कि "उपवर्ग एक स्थानीय-विशिष्ट संदेश का उत्पादन करने के लिए इस विधि को ओवरराइड कर सकते हैं। उप-वर्ग के लिए जो इस पद्धति को ओवरराइड नहीं करते हैं, डिफ़ॉल्ट कार्यान्वयन getMessage () के समान परिणाम देता है।"
fool4jesus

2

नहीं। यह निश्चित रूप से भाषा विशिष्ट कार्यान्वयन का मतलब नहीं है। इसका मतलब है कि कार्यान्वयन जो एक अंतर्राष्ट्रीयकरण (उर्फ i18n) तंत्र का उपयोग करते हैं। देखना यह पेज और क्या संसाधन बंडल हैं की अधिक जानकारी के उनके उपयोग का तरीका के लिए।

जिस्ट यह है कि आप किसी भी टेक्स्ट को रिसोर्स फाइल्स में रखते हैं, जिसमें से आपके पास कई (एक प्रति लोकेल / लैंग्वेज / आदि) हैं और आपका कोड टेक्स्ट को सही रिसोर्स फाइल में देखने के लिए एक मेकेनिज्म का उपयोग करता है (मेरे द्वारा दी गई लिंक डिटेल्स में जाती है )।

यह कब और कहाँ उपयोग हो जाता है, इसका पूरी तरह से आप पर भरोसा है। आम तौर पर आप केवल इस बारे में चिंतित होंगे जब आप एक गैर-तकनीकी उपयोगकर्ता के लिए एक अपवाद प्रस्तुत करना चाहते हैं, जो अंग्रेजी को अच्छी तरह से नहीं जानते हैं। उदाहरण के लिए, यदि आप केवल लॉग करने के लिए लिख रहे हैं (जो आमतौर पर केवल तकनीकी उपयोगकर्ता पढ़ते हैं और इसलिए एक सामान्य i18n लक्ष्य नहीं है) तो आप क्या करेंगे:

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 विधि को ओवरराइड कर दिया होगा। यदि यह नहीं है, तो इसके सुपर क्लास में से एक की विधि को कहा जाता है, जो डिफ़ॉल्ट रूप से गेटमैसेज का परिणाम देता है।

इसलिए ज्यादातर मामलों में, परिणाम समान होगा लेकिन कुछ मामलों में यह उस क्षेत्र की भाषा में अपवाद नाम लौटा देगा जहां कार्यक्रम चलाया जा रहा है।

क्या इसका मतलब भाषा विशिष्ट कार्यान्वयन है? जैसे अगर मैं अंग्रेजी में 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.