Difference between e.getMessage() and e.getLocalizedMessage()
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.
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.