【问题标题】:Difference between e.getMessage() and e.getLocalizedMessage()e.getMessage() 和 e.getLocalizedMessage() 之间的区别
【发布时间】:2014-07-28 04:35:14
【问题描述】:

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

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

我在网上搜索了一下,在Answers.com找到了这个答案:

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

例如,想象您正在将代码从美式英语公司/团体改编为英式英语团体。您可能希望创建自定义 Exception 类来覆盖 getLocalizedMessage 以将拼写和语法更正为将使用您的代码的用户和开发人员可能期望的内容。这也可以用于异常消息的实际翻译。


问题

  • 这是否意味着特定于语言的实现?就像我使用 e.getLocalizedMessage() 一样,例如我的应用程序是 English - 如果我在 Spanish 中使用我的应用程序,English 会抛出错误 - 然后会抛出错误西班牙语

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

【问题讨论】:

  • 是的,它表示特定于区域设置(语言、文化)的实现。 official documentation 怎么了?

标签: java exception


【解决方案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());
    }
}

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

何时使用

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

【讨论】:

  • “据我了解,getMessage() 返回异常的名称。”这是错误的。异常的名称可从e.getClass().getSimpleName() 中找到。 new NullPointerException().getMessage() 返回“null”,而不是“NullPointerException”。
  • 然而,这里的陷阱是该方法实际上并不采用语言环境,因此并不总是可以获得用户的语言环境。特别是,此答案中异常的实现方式只会正确本地化 GUI 应用程序的异常。对于服务器端应用程序,JVM 的默认语言环境与用户的不同,因此最好的策略是永远不要调用 ResourceBundle.getBundle(String) 并始终提供用户的实际语言环境。 (例如,对于 Web 应用程序,您通常会在标题中收到有关用户区域设置的信息。)
  • 第一句话本身就是错误的。 getMessage() 返回可抛出/异常的详细消息字符串。
【解决方案2】:

真是令人惊讶——查看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;

除了文档之外,这两种方法的实现都没有变化。

【讨论】:

  • 文档明确指出“子类可能会覆盖此方法以生成特定于语言环境的消息。对于不覆盖此方法的子类,默认实现返回与 getMessage() 相同的结果。”
【解决方案3】:

没有。它绝对不意味着特定于语言的实现。这意味着使用国际化(又名 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);
}

【讨论】:

    【解决方案4】:
    public String  getMessage() 
    

    返回此 throwable 的详细消息字符串。

    public String getLocalizedMessage() 
    

    创建此 throwable 的本地化描述。子类可以 覆盖此方法以生成特定于语言环境的消息。为了 不覆盖此方法的子类,默认实现 返回与getMessage() 相同的结果。

    在你的情况下,e 只不过是异常的对象......

    getLocalizedMessage() 你需要覆盖并给出你自己的信息,即 本地化消息的含义。

    比如……如果有空指针异常……

    打印 e 会显示 null

    e.getMessage() ---> NullPointerException
    

    【讨论】:

      【解决方案5】:

      这就是 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();
      }
      

      【讨论】:

        【解决方案6】:

        据我了解,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 会显示 null

        e.getMessage() ---> NullPointerException 
        

        Read more...

        【讨论】:

          【解决方案7】:

          据我了解,getMessage 返回异常的名称。

          getLocalizedMessage 以用户的本地语言(中文、日文等)返回异常名称。

          为了完成这项工作,您调用getLocalizedMessage 的类必须覆盖getLocalizedMessage 方法。

          如果没有,则调用其中一个超类的方法,默认情况下只返回getMessage 的结果。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-25
            • 2020-05-10
            • 2014-09-20
            • 2010-10-28
            • 2015-10-04
            • 2012-08-12
            相关资源
            最近更新 更多