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

JavaException

Java Problem Overview


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/

Java Solutions


Solution 1 - Java

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.

Solution 2 - Java

It is really surprising - Check the openJDK 7 code of [Throwable.java][1] 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. [1]: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/Throwable.java

Solution 3 - Java

no. it definitely does not mean language specific implementations. it means implementations that use an internationalization (aka i18n) mechanism. see this page for more details of what resource bundles are and how to use them.

the gist is that you place any text in resource files, of which you have many (one per locale/language/etc) and your code uses a mechanism to look up the text in the correct resource file (the link i provided goes into details).

as to when and where this gets used, its entirely up to you. normally you'd only be concerned about this when you want to present an exception to a non-technical user, who may not know english that well. so for example, if you're just writing to log (which commonly only technical users read and so isnt a common i18n target) you'd do:

try {
   somethingDangerous();
} catch (Exception e) {
   log.error("got this: "+e.getMessage());
}

but if you intend to display the exception message to the screen (as a small dialogue, for example) then you might want to display the message in a local language:

try {
   somethingDangerous();
} catch (Exception e) {
   JOptionPane.showMessageDialog(frame,
    e.getLocalizedMessage(),
    "Error",  <---- also best be taken from i18n
    JOptionPane.ERROR_MESSAGE);
}

Solution 4 - Java

public String  getMessage() 

Returns the detail message string of this throwable.

public String getLocalizedMessage() 

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 getMessage().

In your case e is nothing but the object of exception ...

getLocalizedMessage() u need to override and give your own message i.e the meaning for localized message.

For example ... if there is a null pointer exception ...

By printing e it will display null

e.getMessage() ---> NullPointerException

Solution 5 - Java

This is what the Throwable.java class have to say. Maybe it can help someone:

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

Solution 6 - Java

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.

So in most cases, the result will be the same but in some cases it will return the exception name in the language of the region where the program is being run.

> 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

public String 
getMessage() 

Returns the detail message string of this throwable.





public String 
getLocalizedMessage() 

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 getMessage().

In your case e is nothing but the object of exception ...

getLocalizedMessage() u need to override and give your own message i.e 
the meaning for localized message. 

For example ... if there is a null pointer exception ...

By printing e it will display null

e.getMessage() ---> NullPointerException 

Read more...

Solution 7 - Java

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDevrathView Question on Stackoverflow
Solution 1 - JavadgmView Answer on Stackoverflow
Solution 2 - JavaSubhrajyoti MajumderView Answer on Stackoverflow
Solution 3 - JavaradaiView Answer on Stackoverflow
Solution 4 - JavaUmer KianiView Answer on Stackoverflow
Solution 5 - JavasiviView Answer on Stackoverflow
Solution 6 - JavaDeepanshu J bediView Answer on Stackoverflow
Solution 7 - JavarahulView Answer on Stackoverflow