Solución:
Como todos han mencionado anteriormente:
A mi entender, getMessage()
devuelve el nombre de la excepción. getLocalizedMessage()
devuelve el nombre de la excepción en el idioma local del usuario (chino, japonés, etc.). Para que esto funcione, la clase a la que está llamando getLocalizedMessage()
debe haber anulado el getLocalizedMessage()
método. Si no es así, se llama al método de una de sus superclases, que de forma predeterminada solo devuelve el resultado de getMessage.
Además de eso, me gustaría poner un segmento de código que explique cómo usarlo.
Cómo usarlo
Java no hace nada mágico, pero proporciona una forma de hacernos la vida más fácil. Usar getLocalizedMessage()
efectivamente, tenemos que anular el comportamiento predeterminado.
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
se utiliza para realizar la localización.
En este ejemplo, debe colocar archivos de propiedades específicos del idioma en el loc/exc/test
sendero. Por ejemplo:
message_fr.properties (que contiene alguna clave y valor):
key1=this is key one in France
message.properties (que contiene alguna clave y valor):
key1=this is key one in English
Ahora, supongamos que nuestra clase generadora de excepciones es algo así como
public class ExceptionGenerator {
public void generateException() throws MyLocalizedThrowable {
throw new MyLocalizedThrowable("key1");
}
}
y la clase principal es:
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());
}
}
De forma predeterminada, devolverá el valor de la clave “Inglés” si está ejecutando en el entorno “Inglés”. Si configura el local en Francia, obtendrá la salida del archivo message_fr.
Cuando usarlo
Si su aplicación necesita ser compatible con l10n / i18n, debe utilizarla. Pero la mayoría de la aplicación no necesita hacerlo, ya que la mayoría de los mensajes de error no son para el cliente final, sino para el ingeniero de soporte / ingeniero de desarrollo.
Es realmente sorprendente: verifique el código openJDK 7 de la clase Throwable.java.
Implementación de getLocalizedMessage
es –
390 public String getLocalizedMessage() {
391 return getMessage();
392 }
Y la implementación de getMessage
es –
376 public String getMessage() {
377 return detailMessage;
378 }
Y
130 private String detailMessage;
No hay cambios en la implementación de ambos métodos, sino en la documentación.
no. definitivamente no significa implementaciones específicas del lenguaje. significa implementaciones que utilizan un mecanismo de internacionalización (también conocido como i18n). consulte esta página para obtener más detalles sobre qué son los paquetes de recursos y cómo utilizarlos.
la esencia es que coloca cualquier texto en archivos de recursos, de los cuales tiene muchos (uno por configuración regional / idioma / etc.) y su código utiliza un mecanismo para buscar el texto en el archivo de recursos correcto (el enlace que proporcioné entra en detalles ).
en cuanto a cuándo y dónde se usa esto, depende completamente de usted. normalmente, esto solo le preocupará cuando desee presentar una excepción a un usuario no técnico, que puede que no sepa tan bien el inglés. así que, por ejemplo, si solo está escribiendo para registrar (que normalmente solo leen los usuarios técnicos y, por lo tanto, no es un objetivo común de i18n), haría:
try {
somethingDangerous();
} catch (Exception e) {
log.error("got this: "+e.getMessage());
}
pero si tiene la intención de mostrar el mensaje de excepción en la pantalla (como un pequeño diálogo, por ejemplo), es posible que desee mostrar el mensaje en un idioma local:
try {
somethingDangerous();
} catch (Exception e) {
JOptionPane.showMessageDialog(frame,
e.getLocalizedMessage(),
"Error", <---- also best be taken from i18n
JOptionPane.ERROR_MESSAGE);
}