小编典典

e.getMessage()和e.getLocalizedMessage()之间的区别

java

  • 我在执行错误处理时同时使用这两种方法来获取catch块抛出的消息
  • 他们俩都从错误处理中得到了我的消息,但是两者的区别到底是什么
  • 我从互联网上搜索了一些内容,然后从这里想出了这个答案

Java异常从Throwable继承其getMessage和getLocalizedMessage方法(请参见相关链接)。区别在于子类应重写getLocalizedMessage以提供特定于语言环境的消息。例如,想象一下您正在将代码从一个说英语的公司/组改编为一个英语-
英语组。您可能需要创建自定义Exception类,该类将覆盖getLocalizedMessage,以将拼写和语法正确化为将使用您的代码的用户和开发人员所期望的内容。这也可以用于异常消息的实际翻译。


问题 ::

  • 这意味着language specific实现吗?就像如果我使用e.getLocalizedMessage()我的应用程序English-错误将被抛出English,如果我使用我的应用程序Spanish-那么错误将被抛出Spanish

  • 需要在何时何地可以使用这些方法的清楚说明


阅读 8660

收藏
2020-10-07

共1个答案

小编典典

就像上面每个人都提到的

据我了解,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());
    }
}

默认情况下,如果您在“英语”环境中执行,它将返回“英语”键值。如果将本地设置为法国,则将从message_fr文件获取输出。

什么时候使用

如果您的应用程序需要支持l10n /
i18n,则需要使用它。但是大多数应用程序并不需要,因为大多数错误消息不是针对最终客户的,而是针对支持工程师/开发工程师的。

2020-10-07