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

时间:2014-07-28 04:35:15

标签: java android

  • 我正在使用这两种方法来获取catch引发的消息 阻止执行错误处理
  • 他们两个都从错误处理中得到了消息但是什么 这两者与
  • 完全不同
  • 我从互联网上搜索了一下,然后想出了这个答案 here

  

Java Exceptions继承了它们的getMessage和getLocalizedMessage   来自Throwable的方法(参见相关链接)。不同之处在于   子类应覆盖getLocalizedMessage以提供   特定于语言环境的消息。例如,您正在适应的成像   从美国英语公司/团体到公司的代码   英英集团。您可能想要创建自定义异常类   它覆盖了getLocalizedMessage来纠正拼写和语法   用户和开发人员将使用您的代码可能会是什么   期望。这也可以用于Exception的实际翻译   消息。


问题 ::

  • 这是否意味着language specific实施?就像我使用e.getLocalizedMessage()一样 例如English中的我的应用程序 - 错误将在English中抛出,如果我 在Spanish中使用我的应用 - 然后会在Spanish

  • 中引发错误
  • 需要清楚解释我何时何地可以使用这些方法 我的使用

8 个答案:

答案 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 

Read more...

答案 7 :(得分:-2)

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

getLocalizedMessage以用户的本地语言(中文,日文等)返回例外的名称。

为了使这项工作正常,您正在调用getLocalizedMessage的类必须覆盖getLocalizedMessage方法。

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