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

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

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


Вопросы :

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

  • Требуется четкое объяснение того, где и когда я могу использовать эти методы в своих целях.

Деврат
источник
1
Да, это означает реализации, специфичные для локали (языка, культуры). Что не так с официальной документацией ?
локаль по умолчанию

Ответы:

72

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

Насколько я понимаю, 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". Если вы установите для локального значения France, вы получите вывод из файла message_fr.

Когда это использовать

Если ваше приложение должно поддерживать l10n / i18n, вам нужно его использовать. Но большая часть приложения не нужна, поскольку большинство сообщений об ошибках предназначены не для конечного пользователя, а для инженера службы поддержки / разработчика.

dgm
источник
6
«Насколько я понимаю, getMessage () возвращает имя исключения». Это просто неправильно. Имя исключения находится из e.getClass().getSimpleName(). new NullPointerException().getMessage()возвращает «null», а не «NullPointerException».
Филип Уайтхаус
1
Однако здесь ловушка состоит в том, что метод на самом деле не принимает языковой стандарт, поэтому не всегда возможно получить языковой стандарт пользователя. В частности, способ реализации исключения в этом ответе будет правильно локализовать исключение только для приложения с графическим интерфейсом. Для серверного приложения языковой стандарт JVM по умолчанию не такой, как у пользователя, поэтому лучшая политика - никогда не вызывать ResourceBundle.getBundle (String) и всегда предоставлять фактический языковой стандарт пользователя. (Например, с веб-приложениями вы обычно получаете информацию о локали пользователя в заголовке.)
Trejkaz 09
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
2

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

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

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

Возвращает строку подробного сообщения этого бросаемого объекта.

public String getLocalizedMessage() 

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

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

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

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

При печати 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. Если нет, вызывается метод одного из его суперклассов, который по умолчанию просто возвращает результат 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. 

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

При печати e будет отображаться null

e.getMessage() ---> NullPointerException 

Читать больше...

Дипаншу Дж беди
источник
-2

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

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

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

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

рахул
источник