- 이 두 가지 방법을 사용하여 오류 처리를 수행하는 동안 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
.