Java Exceptions继承了它们的getMessage和getLocalizedMessage 来自Throwable的方法(参见相关链接)。不同之处在于 子类应覆盖getLocalizedMessage以提供 特定于语言环境的消息。例如,您正在适应的成像 从美国英语公司/团体到公司的代码 英英集团。您可能想要创建自定义异常类 它覆盖了getLocalizedMessage来纠正拼写和语法 用户和开发人员将使用您的代码可能会是什么 期望。这也可以用于Exception的实际翻译 消息。
问题 ::
这是否意味着language specific
实施?就像我使用e.getLocalizedMessage()
一样
例如English
中的我的应用程序 - 错误将在English
中抛出,如果我
在Spanish
中使用我的应用 - 然后会在Spanish
需要清楚解释我何时何地可以使用这些方法 我的使用
答案 0 :(得分:55)
正如大家上面提到的那样 -
据我了解,getMessage()
返回异常的名称。 getLocalizedMessage()
以用户的本地语言(中文,日文等)返回例外的名称。为了使这项工作,您调用getLocalizedMessage()
的类必须覆盖getLocalizedMessage()
方法。如果没有,则调用其中一个超类的方法,默认情况下只返回getMessage的结果。
除此之外,我想提一些代码段来解释如何使用它。
如何使用
Java没有什么神奇之处,但确实提供了一种让我们的生活更轻松的方法。
要有效地使用getLocalizedMessage()
,我们必须覆盖默认行为。
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
用于进行本地化。
在此示例中,您必须将特定于语言的属性文件放在loc/exc/test
路径中。例如:
message_fr.properties(包含一些键和值):
key1=this is key one in France
message.properties(包含一些键和值):
key1=this is key one in English
现在,让我们假设我们的异常生成器类类似于
public class ExceptionGenerator {
public void generateException() throws MyLocalizedThrowable {
throw new MyLocalizedThrowable("key1");
}
}
主要类是:
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());
}
}
默认情况下,如果您在“英语”环境中执行,它将返回“英语”键值。如果将local设置为France,则将从message_fr文件中获取输出。
何时使用
如果您的应用需要支持l10n / i18n,则需要使用它。但是大多数应用程序都不需要,因为大多数错误消息不是针对最终客户,而是针对支持工程师/开发工程师。
答案 1 :(得分:4)
这真的很令人惊讶 - 检查Throwable.java类的openJDK 7代码。
getLocalizedMessage
的实施是 -
390 public String getLocalizedMessage() {
391 return getMessage();
392 }
getMessage
的实施是 -
376 public String getMessage() {
377 return detailMessage;
378 }
和
130 private String detailMessage;
两种方法的实施都没有变化,但是文档。
答案 2 :(得分:2)
没有。它绝对不意味着语言特定的实现。它意味着使用国际化(aka i18n)机制的实现。有关哪些资源包以及如何使用它们的详细信息,请参阅this page。
要点是您将任何文本放在资源文件中,其中有许多文件(每个区域设置/语言/等),并且您的代码使用机制在正确的资源文件中查找文本(我提供的链接)进入细节)。
关于何时何地使用它,完全取决于你。通常,当你想向非技术用户提出例外情况时,你只会担心这一点,而非技术用户可能不太了解英语。例如,如果您只是写入日志(通常只有技术用户阅读,因此不是常见的i18n目标),您可以这样做:
try {
somethingDangerous();
} catch (Exception e) {
log.error("got this: "+e.getMessage());
}
但如果您打算在屏幕上显示异常消息(例如,作为小对话框),那么您可能希望以本地语言显示消息:
try {
somethingDangerous();
} catch (Exception e) {
JOptionPane.showMessageDialog(frame,
e.getLocalizedMessage(),
"Error", <---- also best be taken from i18n
JOptionPane.ERROR_MESSAGE);
}
答案 3 :(得分:2)
public String getMessage()
返回此throwable的详细消息字符串。
public String getLocalizedMessage()
创建此throwable的本地化描述。子类可以
重写此方法以生成特定于语言环境的消息。对于
不重写此方法的子类,默认实现
返回与getMessage()
相同的结果。
在你的情况下,e只是异常的对象......
getLocalizedMessage()
你需要覆盖并给出你自己的信息,即
本地化消息的含义。
例如......如果有空指针异常......
通过打印e,它将显示为空
e.getMessage() ---> NullPointerException
答案 4 :(得分:0)
这是Throwable.java类必须要说的。也许它可以帮助别人:
/**
* 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();
}
答案 5 :(得分:0)
getLocalizedMessage()
类的Throwable
方法用于在发生异常时获取Throwable对象的特定于语言环境的描述。它有助于我们根据本地特定消息修改Throwable对象的描述。对于不覆盖此方法的子类,此方法的默认实现返回与getMessage()
相同的结果。
了解更多here
答案 6 :(得分:-1)
根据我的理解,getMessage返回异常的名称。 getLocalizedMessage以用户的本地语言(中文,日文等)返回异常的名称。为了使这项工作,您调用getLocalizedMessage的类必须重写getLocalizedMessage方法。如果没有,则调用其中一个超类的方法,默认情况下只返回getMessage的结果。
因此在大多数情况下,结果将是相同的,但在某些情况下,它将以运行程序的区域的语言返回异常名称。
这是否意味着语言特定的实现?就像我使用 e.getLocalizedMessage()例如我的英文应用程序 - 错误将是 抛出英文,如果我用西班牙语使用我的应用程序 - 那么错误将是 用西班牙语投掷
public String
getMessage()
Returns the detail message string of this throwable.
public String
getLocalizedMessage()
创建此throwable的本地化描述。子类可以 重写此方法以生成特定于语言环境的消息。对于 不重写此方法的子类,默认实现 返回与getMessage()相同的结果。
在你的情况下,e只是异常的对象......
getLocalizedMessage() u need to override and give your own message i.e
the meaning for localized message.
例如......如果有空指针异常......
通过打印e,它将显示为空
e.getMessage() ---> NullPointerException
答案 7 :(得分:-2)
据我了解,getMessage
返回异常的名称。
getLocalizedMessage
以用户的本地语言(中文,日文等)返回例外的名称。
为了使这项工作正常,您正在调用getLocalizedMessage
的类必须覆盖getLocalizedMessage
方法。
如果它没有,则调用其中一个超类的方法,默认情况下只返回getMessage
的结果。