Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between e.getMessage() and e.getLocalizedMessage()

Tags:

java

android

What is the difference between the getMessage and getLocalizedMessage methods on Java exceptions?

I am using these both methods to get the message thrown by the catch block while performing error handling. Both of them get me the message from the error handling, but how exactly do these two differ?

I did some searching on the Internet and found this answer on Answers.com:

Java Exceptions inherit their getMessage and getLocalizedMessage methods from Throwable (see the related link). The difference is that subclasses should override getLocalizedMessage to provide a locale-specific message.

For example, imaging that you're adapting code from an American-English speaking company/group to a British-English group. You may want to create custom Exception classes which override the getLocalizedMessage to correct spelling and grammer to what the users and developers who will be using your code might expect. This can also be used for actual translations of Exception messages.


Questions:

  • Does that mean language specific implementations? Like if I use e.getLocalizedMessage() for example my app in English - error will be thrown in English, if I use my app in Spanish - then error will be thrown in Spanish?

  • Need some clear explanation on where and when I can use these methods to my use/

like image 807
Devrath Avatar asked Jul 28 '14 04:07

Devrath


People also ask

What is e getMessage ()?

The getMessage() method of Throwable class is used to return a detailed message of the Throwable object which can also be null. One can use this method to get the detail message of exception as a string value. Syntax: public String getMessage()

What is getLocalizedMessage?

The getLocalizedMessage() method of Throwable class is used to get a locale-specific description of the Throwable object when an Exception Occurred. It helps us to modify the description of the Throwable object according to the local Specific message.

Why is e getMessage null?

You are catching a different exception to the one that your code is explicitly creating and throwing1. The exception that you are catching doesn't have a message. You need to log the entire exception, not just the exception's message.

How do I read an exception message in Java?

Following are the different ways to handle exception messages in Java. Using printStackTrace() method − It print the name of the exception, description and complete stack trace including the line where exception occurred. Using toString() method − It prints the name and description of the exception.


2 Answers

As everybody has mentioned above --

To my understanding, getMessage() returns the name of the exception. getLocalizedMessage() returns the name of the exception in the local language of the user (Chinese, Japanese etc.). In order to make this work, the class you are calling getLocalizedMessage() on must have overridden the getLocalizedMessage() method. If it hasn't, the method of one of it's super classes is called which by default just returns the result of getMessage.

In addition to that, I would like to put some code segment explaining how to use it.

How to use it

Java does nothing magical, but it does provide a way to make our life easier. To use getLocalizedMessage() effectively, we have to override the default behavior.

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 is used to do localization.

In this example, you have to place language-specific property files in the loc/exc/test path. For example:

message_fr.properties (containing some key and value):

key1=this is key one in France 

message.properties (containing some key and value):

key1=this is key one in English 

Now, let us assume that our exception generator class is something like

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

and the main class is:

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

By default, it will return the "English" key value if you are executing in the "English" environment. If you set the local to France, you will get the output from the message_fr file.

When to use it

If your application needs to support l10n/i18n you need to use it. But most of the application does not need to, as most error messages are not for the end customer, but for the support engineer/development engineer.

like image 145
dgm Avatar answered Oct 22 '22 02:10

dgm


It is really surprising - Check the openJDK 7 code of Throwable.java class.

Implementation of getLocalizedMessage is -

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

And implemenation of getMessage is -

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

And

130     private String detailMessage; 

There is no change in implemenation of both method but documentation.

like image 40
Subhrajyoti Majumder Avatar answered Oct 22 '22 02:10

Subhrajyoti Majumder