- Estoy usando estos dos métodos para obtener el mensaje que arroja el bloque de captura mientras realizo el manejo de errores
- Ambos me reciben el mensaje del manejo de errores, pero ¿en qué se diferencian exactamente estos dos?
- Hice algunas búsquedas en Internet y obtuve esta respuesta desde aquí
Las excepciones de Java heredan sus métodos getMessage y getLocalizedMessage de Throwable (consulte el enlace relacionado). La diferencia es que las subclases deben anular getLocalizedMessage para proporcionar un mensaje específico de la configuración regional. Por ejemplo, imagina que estás adaptando código de una empresa / grupo de habla inglesa americana a un grupo de inglés británico. Es posible que desee crear clases de excepción personalizadas que anulen getLocalizedMessage para corregir la ortografía y la gramática según lo que los usuarios y desarrolladores que usarán su código podrían esperar. Esto también se puede utilizar para traducciones reales de mensajes de excepción.
Preguntas :
¿Eso significa
language specific
implementaciones? como si uso,e.getLocalizedMessage()
por ejemplo, mi aplicación enEnglish
- se lanzará un errorEnglish
, si uso mi aplicación enSpanish
- entonces se lanzará un errorSpanish
Necesito una explicación clara sobre dónde y cuándo puedo usar estos métodos para mi uso
Respuestas:
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á llamandogetLocalizedMessage()
debe haber anulado elgetLocalizedMessage()
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. Para usarlo de manera
getLocalizedMessage()
efectiva, 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 la
loc/exc/test
ruta. 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 usarla. Pero la mayor parte 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.
fuente
e.getClass().getSimpleName()
.new NullPointerException().getMessage()
devuelve "nulo", no "NullPointerException".Es realmente sorprendente: verifique el código openJDK 7 de la clase Throwable.java .
Implementación de
getLocalizedMessage
is -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.
fuente
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); }
fuente
public String getMessage()
Devuelve la cadena del mensaje de detalle de este arrojable.
public String getLocalizedMessage()
Crea una descripción localizada de este elemento arrojadizo. Las subclases pueden anular este método para producir un mensaje específico de la configuración regional. Para las subclases que no anulan este método, la implementación predeterminada devuelve el mismo resultado que
getMessage()
.En su caso, e no es más que el objeto de excepción ...
getLocalizedMessage()
Debe anular y dar su propio mensaje, es decir, el significado del mensaje localizado.Por ejemplo ... si hay una excepción de puntero nulo ...
Al imprimir e, se mostrará nulo
fuente
Esto es lo que tiene que decir la clase Throwable.java. Quizás pueda ayudar a alguien:
/** * 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(); }
fuente
Según tengo entendido, 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 método getLocalizedMessage. Si no es así, se llama al método de una de sus superclases, que de forma predeterminada solo devuelve el resultado de getMessage.
Entonces, en la mayoría de los casos, el resultado será el mismo, pero en algunos casos devolverá el nombre de la excepción en el idioma de la región donde se ejecuta el programa.
public String getMessage() Returns the detail message string of this throwable. public String getLocalizedMessage()
Crea una descripción localizada de este elemento arrojadizo. Las subclases pueden anular este método para producir un mensaje específico de la configuración regional. Para las subclases que no anulan este método, la implementación predeterminada devuelve el mismo resultado que getMessage ().
En su caso, e no es más que el objeto de excepción ...
getLocalizedMessage() u need to override and give your own message i.e the meaning for localized message.
Por ejemplo ... si hay una excepción de puntero nulo ...
Al imprimir e, se mostrará nulo
Lee mas...
fuente
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 elgetLocalizedMessage
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
.fuente