Unterschied zwischen e.getMessage () und e.getLocalizedMessage ()

85
  • Ich verwende diese beiden Methoden, um die Nachricht vom catch-Block zu erhalten, während die Fehlerbehandlung durchgeführt wird
  • Beide bekommen mir die Nachricht von der Fehlerbehandlung, aber womit unterscheiden sich diese beiden genau?
  • Ich habe im Internet gesucht und von hier aus diese Antwort gefunden

Java-Ausnahmen erben ihre Methoden getMessage und getLocalizedMessage von Throwable (siehe den zugehörigen Link). Der Unterschied besteht darin, dass Unterklassen getLocalizedMessage überschreiben sollten, um eine länderspezifische Nachricht bereitzustellen. Stellen Sie sich beispielsweise vor, Sie passen Code von einem amerikanisch-englischsprachigen Unternehmen / einer Gruppe an eine britisch-englische Gruppe an. Möglicherweise möchten Sie benutzerdefinierte Ausnahmeklassen erstellen, die die getLocalizedMessage überschreiben, um Rechtschreibung und Grammatik so zu korrigieren, wie es die Benutzer und Entwickler, die Ihren Code verwenden, erwarten. Dies kann auch für tatsächliche Übersetzungen von Ausnahmemeldungen verwendet werden.


Fragen ::

  • Bedeutet das language specificImplementierungen? Wenn ich e.getLocalizedMessage()zum Beispiel meine App verwende, wird ein EnglishFehler ausgelöst English. Wenn ich meine App verwende, wird ein SpanishFehler ausgelöstSpanish

  • Benötigen Sie eine klare Erklärung, wo und wann ich diese Methoden für meine Verwendung verwenden kann

Devrath
quelle
1
Ja, dies bedeutet länderspezifische (Sprache, Kultur) spezifische Implementierungen. Was ist los mit der offiziellen Dokumentation ?
Standardgebietsschema

Antworten:

72

Wie jeder oben erwähnt hat -

Gibt nach meinem Verständnis getMessage()den Namen der Ausnahme zurück. getLocalizedMessage()Gibt den Namen der Ausnahme in der Landessprache des Benutzers (Chinesisch, Japanisch usw.) zurück. Damit dies funktioniert, muss die Klasse, die Sie aufrufen, getLocalizedMessage()die getLocalizedMessage()Methode überschrieben haben . Wenn dies nicht der Fall ist, wird die Methode einer der Superklassen aufgerufen, die standardmäßig nur das Ergebnis von getMessage zurückgibt.

Darüber hinaus möchte ich ein Codesegment einfügen, in dem die Verwendung erläutert wird.

Wie man es benutzt

Java macht nichts Magisches, aber es bietet eine Möglichkeit, unser Leben einfacher zu machen. Um getLocalizedMessage()effektiv zu verwenden, müssen wir das Standardverhalten überschreiben.

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 wird zur Lokalisierung verwendet.

In diesem Beispiel müssen Sie sprachspezifische Eigenschaftendateien in den loc/exc/testPfad einfügen. Zum Beispiel:

message_fr.properties (enthält einen Schlüssel und einen Wert):

key1=this is key one in France

message.properties (enthält einen Schlüssel und einen Wert):

key1=this is key one in English

Nehmen wir nun an, dass unsere Ausnahmegeneratorklasse so etwas wie ist

public class ExceptionGenerator {

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

und die Hauptklasse ist:

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());
    }
}

Standardmäßig wird der Schlüsselwert "Englisch" zurückgegeben, wenn Sie in der Umgebung "Englisch" ausführen. Wenn Sie den lokalen Wert auf Frankreich setzen, erhalten Sie die Ausgabe aus der Datei message_fr.

Wann man es benutzt

Wenn Ihre Anwendung l10n / i18n unterstützen muss, müssen Sie sie verwenden. Der größte Teil der Anwendung muss dies jedoch nicht, da die meisten Fehlermeldungen nicht für den Endkunden, sondern für den Support- / Entwicklungsingenieur bestimmt sind.

dgm
quelle
6
"Nach meinem Verständnis gibt getMessage () den Namen der Ausnahme zurück." Das ist einfach falsch. Der Name der Ausnahme wird von gefunden e.getClass().getSimpleName(). new NullPointerException().getMessage()gibt "null" zurück, nicht "NullPointerException".
Philip Whitehouse
Die Falle hier ist jedoch, dass die Methode das Gebietsschema nicht tatsächlich verwendet, sodass es nicht immer möglich ist, das Gebietsschema des Benutzers abzurufen. Insbesondere die Art und Weise, wie die Ausnahme in dieser Antwort implementiert wurde, lokalisiert die Ausnahme nur für eine GUI-Anwendung ordnungsgemäß. Bei einer serverseitigen Anwendung ist das Standardgebietsschema der JVM nicht mit dem des Benutzers identisch. Daher empfiehlt es sich, ResourceBundle.getBundle (String) niemals aufzurufen und immer das tatsächliche Gebietsschema des Benutzers anzugeben. (Bei Webanwendungen erhalten Sie beispielsweise normalerweise Informationen zum Gebietsschema des Benutzers in einer Kopfzeile.)
Trejkaz
6

Es ist wirklich überraschend - Überprüfen Sie den openJDK 7-Code der Throwable.java- Klasse.

Implementierung von getLocalizedMessageis -

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

Und die Umsetzung von getMessageist -

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

Und

130     private String detailMessage;

Es gibt keine Änderung in der Implementierung beider Methoden, sondern in der Dokumentation.

Subhrajyoti Majumder
quelle
15
In der Dokumentation heißt es eindeutig: "Unterklassen können diese Methode überschreiben, um eine länderspezifische Nachricht zu erstellen. Bei Unterklassen, die diese Methode nicht überschreiben, gibt die Standardimplementierung das gleiche Ergebnis wie getMessage () zurück."
narr4jesus
2

Nein. es bedeutet definitiv nicht sprachspezifische Implementierungen. Dies bedeutet Implementierungen, die einen Internationalisierungsmechanismus (auch bekannt als i18n) verwenden. Auf dieser Seite finden Sie weitere Informationen zu Ressourcenpaketen und deren Verwendung.

Das Wesentliche ist, dass Sie jeden Text in Ressourcendateien einfügen, von denen Sie viele haben (einen pro Gebietsschema / Sprache / usw.), und Ihr Code einen Mechanismus verwendet, um den Text in der richtigen Ressourcendatei nachzuschlagen (der von mir bereitgestellte Link geht auf Details ein ).

Wann und wo dies verwendet wird, liegt ganz bei Ihnen. Normalerweise sind Sie nur dann darüber besorgt, wenn Sie einem nicht technischen Benutzer, der möglicherweise nicht so gut Englisch spricht, eine Ausnahme präsentieren möchten. Wenn Sie beispielsweise nur in ein Protokoll schreiben (das normalerweise nur von technischen Benutzern gelesen wird und daher kein allgemeines i18n-Ziel ist), würden Sie Folgendes tun:

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

Wenn Sie jedoch die Ausnahmemeldung auf dem Bildschirm anzeigen möchten (z. B. als kleiner Dialog), möchten Sie die Meldung möglicherweise in einer Landessprache anzeigen:

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

Gibt die Detailnachrichtenzeichenfolge dieses Throwables zurück.

public String getLocalizedMessage() 

Erstellt eine lokalisierte Beschreibung dieses Wurfs. Unterklassen können diese Methode überschreiben, um eine länderspezifische Nachricht zu erstellen. Für Unterklassen, die diese Methode nicht überschreiben, gibt die Standardimplementierung das gleiche Ergebnis zurück wie getMessage().

In Ihrem Fall ist e nichts anderes als das Objekt der Ausnahme ...

getLocalizedMessage() Sie müssen Ihre eigene Nachricht überschreiben und angeben, dh die Bedeutung für eine lokalisierte Nachricht.

Zum Beispiel ... wenn es eine Nullzeigerausnahme gibt ...

Durch Drucken von e wird null angezeigt

e.getMessage() ---> NullPointerException
Umer Kiani
quelle
2

Dies ist, was die Throwable.java-Klasse zu sagen hat. Vielleicht kann es jemandem helfen:

/**
 * 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();
}
sivi
quelle
-2

Nach meinem Verständnis gibt getMessage den Namen der Ausnahme zurück. getLocalizedMessage gibt den Namen der Ausnahme in der Landessprache des Benutzers (Chinesisch, Japanisch usw.) zurück. Damit dies funktioniert, muss die Klasse, für die Sie getLocalizedMessage aufrufen, die Methode getLocalizedMessage überschrieben haben. Wenn dies nicht der Fall ist, wird die Methode einer der Superklassen aufgerufen, die standardmäßig nur das Ergebnis von getMessage zurückgibt.

In den meisten Fällen ist das Ergebnis das gleiche, in einigen Fällen wird jedoch der Ausnahmenname in der Sprache der Region zurückgegeben, in der das Programm ausgeführt wird.

Bedeutet das sprachspezifische Implementierungen? Wenn ich zum Beispiel e.getLocalizedMessage () verwende, wird meine App auf Englisch angezeigt. Der Fehler wird auf Englisch ausgegeben. Wenn ich meine App auf Spanisch verwende, wird der Fehler auf Spanisch ausgegeben

public String 
getMessage() 

Returns the detail message string of this throwable.





public String 
getLocalizedMessage() 

Erstellt eine lokalisierte Beschreibung dieses Wurfs. Unterklassen können diese Methode überschreiben, um eine länderspezifische Nachricht zu erstellen. Für Unterklassen, die diese Methode nicht überschreiben, gibt die Standardimplementierung dasselbe Ergebnis zurück wie getMessage ().

In Ihrem Fall ist e nichts anderes als das Objekt der Ausnahme ...

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

Zum Beispiel ... wenn es eine Nullzeigerausnahme gibt ...

Durch Drucken von e wird null angezeigt

e.getMessage() ---> NullPointerException 

Weiterlesen...

Deepanshu J bedi
quelle
-2

Gibt nach meinem Verständnis getMessageden Namen der Ausnahme zurück.

getLocalizedMessage Gibt den Namen der Ausnahme in der Landessprache des Benutzers (Chinesisch, Japanisch usw.) zurück.

Damit dies funktioniert, muss die Klasse, die Sie aufrufen, getLocalizedMessagedie getLocalizedMessageMethode überschrieben haben .

Wenn dies nicht der Fall ist, wird die Methode einer der Superklassen aufgerufen, die standardmäßig nur das Ergebnis von zurückgibt getMessage.

rahul
quelle