- Я использую оба этих метода, чтобы получить сообщение, создаваемое блоком catch, при выполнении обработки ошибок.
- Оба они получают мне сообщение от обработки ошибок, но чем именно отличаются эти два
- Я поискал в Интернете и пришел к этому ответу отсюда
Исключения Java наследуют свои методы getMessage и getLocalizedMessage от Throwable (см. Соответствующую ссылку). Разница в том, что подклассы должны переопределять getLocalizedMessage, чтобы предоставить сообщение, зависящее от локали. Например, визуализация того, что вы адаптируете код от англо-американской компании / группы к англо-британской группе. Вы можете создать собственные классы Exception, которые переопределяют getLocalizedMessage, чтобы исправить орфографию и грамматику в соответствии с ожиданиями пользователей и разработчиков, которые будут использовать ваш код. Это также можно использовать для фактического перевода сообщений об исключениях.
Вопросы :
Означает ли это
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". Если вы установите для локального значения France, вы получите вывод из файла message_fr.
Когда это использовать
Если ваше приложение должно поддерживать l10n / i18n, вам нужно его использовать. Но большая часть приложения не нужна, поскольку большинство сообщений об ошибках предназначены не для конечного пользователя, а для инженера службы поддержки / разработчика.
источник
e.getClass().getSimpleName()
.new NullPointerException().getMessage()
возвращает «null», а не «NullPointerException».Это действительно удивительно - проверьте код 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;
Нет изменений в реализации обоих методов, кроме документации.
источник
нет. это определенно не означает реализации на конкретном языке. это означает реализации, использующие механизм интернационализации (он же 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); }
источник
public String getMessage()
Возвращает строку подробного сообщения этого бросаемого объекта.
public String getLocalizedMessage()
Создает локализованное описание этого метательного объекта. Подклассы могут переопределить этот метод, чтобы создать сообщение, зависящее от локали. Для подклассов, которые не переопределяют этот метод, реализация по умолчанию возвращает тот же результат, что и
getMessage()
.В вашем случае e - не что иное, как объект исключения ...
getLocalizedMessage()
Вам нужно переопределить и дать свое собственное сообщение, то есть значение локализованного сообщения.Например ... если есть исключение с нулевым указателем ...
При печати e будет отображаться null
источник
Это то, что должен сказать класс 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.
Таким образом, в большинстве случаев результат будет таким же, но в некоторых случаях он вернет имя исключения на языке региона, в котором выполняется программа.
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
Читать больше...
источник
Насколько я понимаю,
getMessage
возвращает имя исключения.getLocalizedMessage
возвращает имя исключения на местном языке пользователя (китайский, японский и т. д.).Чтобы это работало, класс, который вы вызываете,
getLocalizedMessage
должен переопределитьgetLocalizedMessage
метод.Если нет, вызывается метод одного из его суперклассов, который по умолчанию просто возвращает результат
getMessage
.источник