e.getMessage()とe.getLocalizedMessage()の違い


85
  • 私はこれらの両方の方法を使用して、エラー処理の実行中にcatchブロックによってスローされたメッセージを取得しています
  • どちらもエラー処理からメッセージを受け取りますが、これら2つは正確に何が違うのですか
  • 私はインターネットからいくつか検索し、ここからこの答えを思いついた

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


質問::

  • それはlanguage specific実装を意味しますか?e.getLocalizedMessage()たとえば、アプリを使用した場合、EnglishエラーがスローされEnglishます。アプリを使用した場合Spanish、エラーがスローされます。Spanish

  • これらの方法をいつどこで使用できるかについて、明確な説明が必要です


1
はい、それはロケール(言語、文化)固有の実装を意味します。公式ドキュメントの何が問題になっていますか?
デフォルトロケール

回答:


72

誰もが上で述べたように-

私の理解でgetMessage()は、例外の名前を返します。getLocalizedMessage()例外の名前をユーザーのローカル言語(中国語、日本語など)で返します。これを機能させるには、呼び出しgetLocalizedMessage()ているクラスがgetLocalizedMessage()メソッドをオーバーライドしている必要があります。そうでない場合は、そのスーパークラスの1つのメソッドが呼び出され、デフォルトでは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をサポートする必要がある場合は、それを使用する必要があります。ただし、ほとんどのエラーメッセージはエンドカスタマー向けではなく、サポートエンジニア/開発エンジニア向けであるため、ほとんどのアプリケーションでその必要はありません。


6
「私の理解では、getMessage()は例外の名前を返します。」これは間違っています。例外の名前はから見つかりe.getClass().getSimpleName()ます。 new NullPointerException().getMessage()「NullPointerException」ではなく「null」を返します。
フィリップホワイトハウス2017

1
ただし、ここでの落とし穴は、メソッドが実際にはロケールを取得しないため、ユーザーのロケールを常に取得できるとは限らないことです。特に、この回答の例外が実装されている方法では、GUIアプリケーションの例外が適切にローカライズされるだけです。サーバー側アプリケーションの場合、JVMのデフォルトのロケールはユーザーのロケールと同じではないため、ResourceBundle.getBundle(String)を呼び出さず、常にユーザーの実際のロケールを提供するのが最善のポリシーです。(たとえば、Webアプリケーションでは、通常、ヘッダーでユーザーのロケールに関する情報を受け取ります。)
Trejkaz 2018

6

それは本当に驚くべきことである-のOpenJDKの7コードチェックThrowable.javaのクラスを。

の実装getLocalizedMessageは-

390     public String getLocalizedMessage() {
391         return getMessage();
392     }

そしての実装getMessageは-

376     public String getMessage() {
377         return detailMessage;
378     }

そして

130     private String detailMessage;

両方の方法の実装に変更はありませんが、ドキュメントに変更はありません。


15
ドキュメントには、「ロケール固有のメッセージを生成するために、サブクラスがこのメソッドをオーバーライドする場合があります。このメソッドをオーバーライドしないサブクラスの場合、デフォルトの実装はgetMessage()と同じ結果を返します」と明確に記載されています。
fool4jesus 2015

2

番号。それは間違いなく言語固有の実装を意味するものではありません。これは、国際化(別名i18n)メカニズムを使用する実装を意味します。リソースバンドルとは何か、およびそれらの使用方法の詳細については、このページを参照してください

要点は、リソースファイルにテキストを配置することです。リソースファイルには多くのテキストがあり(ロケール/言語などごとに1つ)、コードはメカニズムを使用して正しいリソースファイル内のテキストを検索します(提供したリンクで詳細を確認できます)。 )。

これがいつどこで使用されるかについては、完全にあなた次第です。通常、これについて心配するのは、英語をあまりよく知らない技術者以外のユーザーに例外を提示したい場合だけです。したがって、たとえば、ログに書き込むだけの場合(通常は技術ユーザーのみが読み取るため、一般的な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);
}

2
public String  getMessage() 

このスロー可能オブジェクトの詳細メッセージ文字列を返します。

public String getLocalizedMessage() 

このスロー可能オブジェクトのローカライズされた説明を作成します。サブクラスは、ロケール固有のメッセージを生成するために、このメソッドをオーバーライドする場合があります。このメソッドをオーバーライドしないサブクラスの場合、デフォルトの実装はと同じ結果を返しますgetMessage()

あなたの場合、eは例外の対象に他なりません...

getLocalizedMessage() u独自のメッセージ、つまりローカライズされたメッセージの意味を上書きして与える必要があります。

たとえば... nullポインタ例外がある場合..。

eを印刷すると、nullが表示されます

e.getMessage() ---> NullPointerException

2

これは、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();
}

-2

私の理解では、getMessageは例外の名前を返します。getLocalizedMessageは、ユーザーのローカル言語(中国語、日本語など)で例外の名前を返します。これを機能させるには、getLocalizedMessageを呼び出すクラスがgetLocalizedMessageメソッドをオーバーライドしている必要があります。そうでない場合は、そのスーパークラスの1つのメソッドが呼び出され、デフォルトではgetMessageの結果が返されます。

そのため、ほとんどの場合、結果は同じになりますが、場合によっては、プログラムが実行されている地域の言語で例外名が返されます。

それは言語固有の実装を意味しますか?たとえば、e.getLocalizedMessage()を使用する場合、アプリは英語で-エラーは英語でスローされます。アプリをスペイン語で使用する場合-エラーはスペイン語でスローされます。

public String 
getMessage() 

Returns the detail message string of this throwable.





public String 
getLocalizedMessage() 

このスロー可能オブジェクトのローカライズされた説明を作成します。サブクラスは、ロケール固有のメッセージを生成するために、このメソッドをオーバーライドする場合があります。このメソッドをオーバーライドしないサブクラスの場合、デフォルトの実装はgetMessage()と同じ結果を返します。

あなたの場合、eは例外の対象に他なりません...

getLocalizedMessage() u need to override and give your own message i.e 
the meaning for localized message. 

たとえば... nullポインタ例外がある場合..。

eを印刷すると、nullが表示されます

e.getMessage() ---> NullPointerException 

続きを読む...


-2

私の理解でgetMessageは、例外の名前を返します。

getLocalizedMessage 例外の名前をユーザーのローカル言語(中国語、日本語など)で返します。

これを機能させるには、呼び出しgetLocalizedMessageているクラスがgetLocalizedMessageメソッドをオーバーライドしている必要があります。

そうでない場合は、そのスーパークラスの1つのメソッドが呼び出され、デフォルトではgetMessage。の結果が返されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.