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

新手上路,请多包涵

Java 异常的 getMessagegetLocalizedMessage 方法有什么区别?

我正在使用这两种方法来获取 catch 块在执行错误处理时抛出的消息。他们都从错误处理中得到消息,但这两者究竟有何不同?

我在 Internet 上进行了一些搜索,并在 Answers.com 上找到了这个答案:

Java Exceptions 从 Throwable 继承它们的 getMessage 和 getLocalizedMessage 方法(参见相关链接)。不同之处在于子类应该覆盖 getLocalizedMessage 以提供特定于语言环境的消息。

例如,假设您正在将美国英语公司/集团的代码改编为英国英语集团。您可能想要创建自定义异常类,它会覆盖 getLocalizedMessage 以更正拼写和语法,以符合将使用您的代码的用户和开发人员可能期望的内容。这也可以用于异常消息的实际翻译。


问题

  • 这是否意味着 特定于语言的 实现?就像我使用 e.getLocalizedMessage() 例如我的 英语 应用程序 - 错误将被抛出 English 如果我使用我的应用程序 西班牙语- 那么错误将被抛出 西班牙语

  • 需要一些关于我可以在何时何地使用这些方法的明确解释/

原文由 Devrath 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.9k
2 个回答

就像上面大家提到的——

据我了解, 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,您需要使用它。但大多数应用程序不需要,因为大多数错误消息不是给最终客户的,而是给支持工程师/开发工程师的。

原文由 dgm 发布,翻译遵循 CC BY-SA 3.0 许可协议

这真的很令人惊讶 - 检查 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;

这两种方法的实现都没有变化,但文档。

原文由 Subhrajyoti Majumder 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题