- 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 specific
Implementierungen? Wenn iche.getLocalizedMessage()
zum Beispiel meine App verwende, wird einEnglish
Fehler ausgelöstEnglish
. Wenn ich meine App verwende, wird einSpanish
Fehler ausgelöstSpanish
Benötigen Sie eine klare Erklärung, wo und wann ich diese Methoden für meine Verwendung verwenden kann
Antworten:
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()
diegetLocalizedMessage()
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/test
Pfad 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.
quelle
e.getClass().getSimpleName()
.new NullPointerException().getMessage()
gibt "null" zurück, nicht "NullPointerException".Es ist wirklich überraschend - Überprüfen Sie den openJDK 7-Code der Throwable.java- Klasse.
Implementierung von
getLocalizedMessage
is -390 public String getLocalizedMessage() { 391 return getMessage(); 392 }
Und die Umsetzung von
getMessage
ist -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.
quelle
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); }
quelle
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
quelle
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(); }
quelle
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.
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
Weiterlesen...
quelle
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
diegetLocalizedMessage
Methode ü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
.quelle