Diferencia entre e.getMessage () y e.getLocalizedMessage ()

84
  • 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 specificimplementaciones? como si uso, e.getLocalizedMessage()por ejemplo, mi aplicación en English- se lanzará un error English, si uso mi aplicación en Spanish- entonces se lanzará un errorSpanish

  • Necesito una explicación clara sobre dónde y cuándo puedo usar estos métodos para mi uso

Devrath
fuente
1
Sí, significa implementaciones específicas de la configuración regional (idioma, cultura). ¿Qué pasa con la documentación oficial ?
configuración regional predeterminada

Respuestas:

71

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. 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/testruta. 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.

dgm
fuente
6
"Según tengo entendido, getMessage () devuelve el nombre de la excepción". Esto simplemente está mal. El nombre de la excepción se encuentra en e.getClass().getSimpleName(). new NullPointerException().getMessage()devuelve "nulo", no "NullPointerException".
Philip Whitehouse
Sin embargo, la trampa aquí es que el método en realidad no toma la configuración regional, por lo que no siempre es posible obtener la configuración regional del usuario. En particular, la forma en que se implementó la excepción en esta respuesta solo localizará correctamente la excepción para una aplicación GUI. Para una aplicación del lado del servidor, la configuración regional predeterminada de la JVM no es la misma que la del usuario, por lo que la mejor política es nunca llamar a ResourceBundle.getBundle (String) y siempre proporcionar la configuración regional real del usuario. (Por ejemplo, con las aplicaciones web, normalmente recibe información sobre la configuración regional del usuario en un encabezado)
Trejkaz
6

Es realmente sorprendente: verifique el código openJDK 7 de la clase Throwable.java .

Implementación de getLocalizedMessageis -

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

Y la implementación de getMessagees -

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.

Subhrajyoti Majumder
fuente
15
La documentación dice claramente "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 ()".
fool4jesus
2

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);
}
radai
fuente
2
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

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

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

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.

¿Eso significa implementaciones específicas del lenguaje? como si uso e.getLocalizedMessage (), por ejemplo, mi aplicación en inglés; se generará un error en inglés, si uso mi aplicación en español, el error se mostrará en español

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

e.getMessage() ---> NullPointerException 

Lee mas...

Deepanshu J bedi
fuente
-2

A mi entender, getMessagedevuelve 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 getLocalizedMessagedebe haber anulado el getLocalizedMessagemé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.

rahul
fuente