ProgramingTip

e.getMessage ()와 e.getLocalizedMessage ()의 차이점

bestdevel 2020. 11. 2. 08:13
반응형

e.getMessage ()와 e.getLocalizedMessage ()의 차이점


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

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


질문 ::

  • 그게 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)를 사용하는 구현을 의미합니다. 리소스의 정의와 사용 방법에 대한 자세한 내용 이 페이지 를 참조하십시오.

요점은 리소스 파일에 텍스트를 배치하고 (로케일 / 언어 / 등당 하나씩) 코드가 올바른 리소스 파일에서 텍스트를 조회하는 것과 사용한다는 것입니다 (제가 제공하는 한 링크는 세부 정보로 이동합니다). ).

이것이 언제 어디서 사용되는 것이 전적으로 귀하에게 달려 있습니다. 일반적으로 영어를 잘 모르는 비에서는 제시하고 싶을 때만 이것에 대해 걱정할 것입니다. 예를 들어 로그에 쓰기 만하는 경우 (일반적으로 기술 사용자 만 읽고 보편적 인 대상이 아님) 다음을 수행합니다.

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() 

이 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();
}

getLocalizedMessage()방법 Throwable클래스는 얻기 위해 사용되는 로케일 특정 설명 예외가 발생했을 때의 Throwable 오브젝트한다. 로컬 특정 메시지에 따라 Throwable 개체의 설명을 수정하는 데 도움이됩니다. 이 메서드를 재정의하지 않는 하위 클래스의 경우이 메서드의 기본 구현은와 동일한 결과를 반환합니다 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.

참고 URL : https://stackoverflow.com/questions/24988491/difference-between-e-getmessage-and-e-getlocalizedmessage

반응형