Подтвердить что ты не робот

Разница между e.getMessage() и e.getLocalizedMessage()

  • Я использую эти оба метода, чтобы получить сообщение, брошенное уловом блокировать при выполнении обработки ошибок
  • Оба из них получают сообщение от обработки ошибок, но что точно эти два отличаются с
  • Я искал в Интернете и придумал этот ответ из здесь

Исключения Java наследуют их getMessage и getLocalizedMessage методы из Throwable (см. соответствующую ссылку). Разница в том, что подклассы должны переопределять getLocalizedMessage, чтобы обеспечить специфичное для локали сообщение. Например, изображение, которое вы адаптируете код от англоязычной говорящей компании/группы до Британско-английская группа. Вы можете создать пользовательские классы исключений которые переопределяют getLocalizedMessage для исправления орфографии и грамматики к тем, что пользователи и разработчики, которые будут использовать ваш код, могут ожидать. Это также можно использовать для фактических переводов Исключения сообщения.


Вопросы::

  • Означает ли это language specific реализации? например, если я использую e.getLocalizedMessage() для пример моего приложения в English - ошибка будет выбрана в English, если i используйте мое приложение в Spanish - тогда ошибка будет выбрана в Spanish

  • Нужно дать ясное объяснение тому, где и когда я могу использовать эти методы к моему использованию

4b9b3361

Ответ 1

Как упоминалось выше -

Насколько я понимаю, getMessage() возвращает имя исключения. getLocalizedMessage() возвращает имя исключения на локальном языке пользователя (китайский, японский и т.д.). Чтобы выполнить эту работу, класс, который вы вызываете getLocalizedMessage() on, должен был переопределить метод 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, вам необходимо его использовать. Но большинству приложений не нужно, так как большинство сообщений об ошибках не для конечного пользователя, а для инженера-разработчика/инженера-разработчика.

Ответ 2

Это действительно удивительно - проверьте код 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;

В реализации обоих методов нет изменений, кроме документации.

Ответ 3

нет. это определенно не означает специфические для языка реализации. это означает реализации, которые используют механизм интернационализации (aka i18n). см. эту страницу для получения более подробной информации о том, какие пакеты ресурсов и как их использовать.

суть заключается в том, что вы размещаете любой текст в файлах ресурсов, из которых у вас много (по одному на язык/язык/etc), и ваш код использует механизм для поиска текста в правильном файле ресурсов (ссылка я предоставлена в деталях).

относительно того, когда и где это используется, оно полностью зависит от вас. обычно вы будете беспокоиться об этом только тогда, когда хотите представить исключение для нетехнического пользователя, который, возможно, плохо знает английский. например, если вы просто пишете журнал (который обычно только технические пользователи читают, и поэтому не является общей целью 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() 

Возвращает строку подробных сообщений этого броска.

public String getLocalizedMessage() 

Создает локализованное описание этого throwable. Подклассы могут переопределить этот метод, чтобы создать сообщение, специфичное для локали. Для подклассы, которые не переопределяют этот метод, реализация по умолчанию возвращает тот же результат, что и getMessage().

В вашем случае e - ничего, кроме объекта исключения...

getLocalizedMessage() Вам нужно переопределить и дать свое собственное сообщение i.e значение для локализованного сообщения.

Например... если существует исключение с нулевым указателем...

При печати e он отобразит нуль

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

Метод getLocalizedMessage() класса Throwable используется для получения описания локали объекта Throwable при возникновении исключения. Это помогает нам изменить описание объекта Throwable в соответствии с локальным Специфическим сообщением. Для подклассов, которые не переопределяют этот метод, реализация этого метода по умолчанию возвращает тот же результат, что и getMessage().

Узнайте больше здесь

Ответ 7

Насколько я понимаю, 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 

Подробнее...

Ответ 8

Насколько я понимаю, getMessage возвращает имя исключения.

getLocalizedMessage возвращает имя исключения на местном языке пользователя (китайский, японский и т.д.).

Чтобы эта работа работала, класс, для которого вы вызываете getLocalizedMessage должен переопределить метод getLocalizedMessage.

Если это не так, вызывается метод одного из его суперклассов, который по умолчанию просто возвращает результат getMessage.