Intereting Posts
Получение MAC-адреса в Android 6.0 Преобразование текста строки в битмап NullPointerException при ротации во время dispatchCreateOptionsMenu, трассировка стека не включает никаких функций в моем приложении Не удается найти файл android.support.design.widget.Snackbar в библиотеке поддержки Убедитесь, что волейбол получает результаты из кеша или по сети Детский фрагмент в представлении фрагмента пейджера исчезает после обмена Как остановить андроид уведомления рингтон через 30 секунд? Как создать потоковый видеоплеер для большого контента? Как использовать getBaseContext () в классе, который не расширяет действие Как проверить конкретную активность с эспрессо? Android: проверить файл xml во время компиляции? Как изменить размер эмулятора AVD в Android Studio? Android WiFi Direct WIFI_P2P_PEERS_CHANGED_ACTION не получил Нет ли подсказки в расширителе Android 4.x? Неверный элемент проверяется при фильтрации ListView в android

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

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

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


Вопросы ::

Solutions Collecting From Web of "Разница между e.getMessage () и e.getLocalizedMessage ()"

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

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

нет. Это определенно не означает специфические для языка реализации. Это означает реализации, которые используют механизм интернационализации (aka 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); } 

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

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

 public String getMessage() 

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

 public String getLocalizedMessage() 

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

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

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

Например … если существует исключение нулевого указателя …

При печати e он отображает значение null

 e.getMessage() ---> NullPointerException 

Насколько я понимаю, 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 ie the meaning for localized message. 

Например … если существует исключение нулевого указателя …

При печати e он отображает значение null

 e.getMessage() ---> NullPointerException 

Прочитайте больше…

Это то, что должен сказать класс 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(); } 

Насколько я понимаю, getMessage возвращает имя исключения. GetLocalizedMessage возвращает имя исключения на локальном языке пользователя (китайский, японский и т. Д.). Чтобы выполнить эту работу, класс, который вы вызываете getLocalizedMessage, должен был переопределить метод getLocalizedMessage. Если это не так, вызывается метод одного из его суперклассов, который по умолчанию возвращает результат getMessage.