[java] e.getMessage ()와 e.getLocalizedMessage ()의 차이점

  • 이 두 가지 방법을 사용하여 오류 처리를 수행하는 동안 catch 블록에서 발생한 메시지를 얻습니다.
  • 둘 다 오류 처리에서 메시지를 받았지만이 두 가지가 정확히 어떻게 다른가요?
  • 나는 인터넷에서 약간의 검색을했고 여기 에서이 대답을 찾았습니다.

Java 예외는 Throwable에서 getMessage 및 getLocalizedMessage 메소드를 상속합니다 (관련 링크 참조). 차이점은 하위 클래스가 로케일 별 메시지를 제공하려면 getLocalizedMessage를 재정의해야한다는 것입니다. 예를 들어, 미국 영어를 사용하는 회사 / 그룹의 코드를 영국-영어 그룹으로 조정하고 있음을 이미지화합니다. 코드를 사용할 사용자와 개발자가 예상 할 수있는 맞춤법 및 문법을 수정하기 위해 getLocalizedMessage를 재정의하는 사용자 지정 Exception 클래스를 만들 수 있습니다. 이는 예외 메시지의 실제 번역에도 사용할 수 있습니다.


질문 ::

  • 그게 language specific구현 을 의미합니까 ? e.getLocalizedMessage()예를 들어 내 앱을 사용하면 English오류가 발생 English합니다. 내 앱을 사용하면 Spanish오류가 발생합니다.Spanish

  • 이 방법을 언제 어디서 사용할 수 있는지에 대한 명확한 설명이 필요합니다.



답변

모두가 위에서 언급했듯이-

내 이해에 getMessage()예외의 이름을 반환합니다. getLocalizedMessage()사용자의 현지 언어 (중국어, 일본어 등)로 예외 이름을 반환합니다. 이 작업을 수행 getLocalizedMessage()하려면 호출 중인 클래스 가 getLocalizedMessage()메서드를 재정의해야합니다 . 그렇지 않은 경우 기본적으로 getMessage의 결과 만 반환하는 수퍼 클래스 중 하나의 메서드가 호출됩니다.

그 외에도 사용 방법을 설명하는 코드 세그먼트를 추가하고 싶습니다.

이것을 어떻게 사용 하는가

자바는 마법 같은 것은 아니지만 우리의 삶을 더 쉽게 만드는 방법을 제공합니다. 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을 지원해야하는 경우이를 사용해야합니다. 그러나 대부분의 오류 메시지는 최종 고객이 아니라 지원 엔지니어 / 개발 엔지니어를위한 것이므로 대부분의 응용 프로그램은 필요하지 않습니다.


답변

정말 놀랍습니다 . Throwable.java 클래스 의 openJDK 7 코드를 확인하십시오 .

의 구현 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()

이 throwable의 세부 메시지 문자열을 반환합니다.

public String getLocalizedMessage()

이 throwable의 지역화 된 설명을 만듭니다. 로케일 별 메시지를 생성하기 위해 서브 클래스가이 메소드를 재정의 할 수 있습니다. 이 메서드를 재정의하지 않는 하위 클래스의 경우 기본 구현은와 동일한 결과를 반환합니다 getMessage().

귀하의 경우 e는 예외의 대상입니다 …

getLocalizedMessage() u 자신의 메시지, 즉 현지화 된 메시지의 의미를 재정의하고 제공해야합니다.

예를 들어 … 널 포인터 예외가있는 경우 …

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의 결과 만 반환하는 수퍼 클래스 중 하나의 메서드가 호출됩니다.

따라서 대부분의 경우 결과는 동일하지만 경우에 따라 프로그램이 실행되는 지역의 언어로 예외 이름을 반환합니다.

그게 언어 별 구현을 의미합니까? 예를 들어 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를 인쇄하면 null이 표시됩니다.

e.getMessage() ---> NullPointerException

더 읽어보기 …


답변

내 이해에 getMessage예외의 이름을 반환합니다.

getLocalizedMessage 사용자의 현지 언어 (중국어, 일본어 등)로 예외 이름을 반환합니다.

이 작업을 수행 getLocalizedMessage하려면 호출 중인 클래스 가 getLocalizedMessage메서드를 재정의해야합니다 .

그렇지 않은 경우 기본적으로 결과를 반환하는 수퍼 클래스 중 하나의 메서드가 호출됩니다 getMessage.