1. ホーム
  2. java

[解決済み] e.getMessage()とe.getLocalizedMessage()の相違点

2022-02-07 15:27:59

質問

  • この2つのメソッドを使用して、catchメソッドでスローされるメッセージを取得します。 ブロックはエラー処理中に
  • どちらもエラー処理からメッセージを受け取ります。 この2つは具体的にどう違うのか
  • ネットで検索してみると、こんな答えが返ってきました。 こちら

Java の例外は、getMessage と getLocalizedMessage を継承しています。 メソッドを Throwable から継承しています (関連リンク参照)。違いは サブクラスは、getLocalizedMessageをオーバーライドして ロケール固有のメッセージです。例えば、あなたが アメリカ英語を話す会社/グループのコードから イギリス英語のグループ カスタム Exception クラスを作成することもできます。 getLocalizedMessageをオーバーライドし、スペルや文法を修正します。 あなたのコードを使用するユーザーや開発者が想定するように を期待します。これは、Exceptionの実際の翻訳にも使用できる。 のメッセージを表示します。


質問内容 ::

  • ということでしょうか? 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());
    }
}

デフォルトでは、"English"環境で実行した場合、"English"キー値を返します。ローカルをフランスに設定すると、message_frファイルからの出力が得られます。

どんな時に使うか

アプリケーションがl10n/i18nをサポートする必要がある場合、これを使用する必要があります。しかし、ほとんどのエラーメッセージはエンドカスタマー向けではなく、サポートエンジニア/開発エンジニア向けなので、ほとんどのアプリケーションはその必要がないのです。