当前位置: 首页 > 面试题库 >

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

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

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

问题 ::

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

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


问题答案:

就像上面每个人都提到的

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



 类似资料:
  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。

  • 问题内容: 有人可以解释一下 和 我不知道“确切”的含义 问题答案: 在这个例子中,什么都没有。当您具有多个具有相似名称的路径时,该参数将起作用: 例如,假设我们有一个显示用户列表的组件。我们还有一个用于创建用户的组件。的网址应嵌套在下。因此,我们的设置可能如下所示: 现在,这里的问题是,当我们转到路由器时,将通过所有定义的路由,并返回它找到的第一个匹配项。因此,在这种情况下,它将首先找到路线,然

  • 问题内容: 我很好奇printStackTrace()和toString()之间的区别是什么。乍一看,他们 似乎 做的完全相同。 码: 问题答案: 不,有重要区别!使用toString,您只有异常的类型和错误消息。使用printStackTrace()可以获得异常的整个堆栈跟踪,这对于调试非常有帮助。 System.out.println(toString())的示例: printStackTra

  • 问题内容: 我看不到两种方式之间的任何区别,@ Qualifier 始终与 @Autowired一起使用 。 VS 有人能让我知道其中的区别吗?谢谢! 问题答案: 可以单独使用。如果单独使用,将按类型进行接线。因此,如果在容器中声明了多个相同类型的bean,而又不知道要注入哪个bean,就会出现问题。结果,通过指定Bean名称(按名称进行绑定),与一起使用来阐明要实际连接的Bean 也按名称接线。