Sự khác biệt giữa e.getMessage () và e.getLocalizedMessage ()


84
  • Tôi đang sử dụng cả hai phương pháp này để nhận thông báo do khối bắt ném trong khi thực hiện xử lý lỗi
  • Cả hai đều nhận được thông báo cho tôi từ việc xử lý lỗi nhưng chính xác thì hai điều này khác nhau ở điểm nào
  • Tôi đã thực hiện một số tìm kiếm từ internet và tìm ra câu trả lời từ đây

Các ngoại lệ Java kế thừa các phương thức getMessage và getLocalizedMessage của chúng từ Throwable (xem liên kết liên quan). Sự khác biệt là các lớp con sẽ ghi đè getLocalizedMessage để cung cấp một thông báo theo ngôn ngữ cụ thể. Ví dụ: hình ảnh rằng bạn đang điều chỉnh mã từ một công ty / nhóm nói tiếng Anh-Mỹ sang một nhóm Anh-Anh. Bạn có thể muốn tạo các lớp Ngoại lệ tùy chỉnh ghi đè getLocalizedMessage để sửa lỗi chính tả và grammer theo những gì người dùng và nhà phát triển sẽ sử dụng mã của bạn có thể mong đợi. Điều này cũng có thể được sử dụng cho các bản dịch thực tế của các thông báo Ngoại lệ.


Câu hỏi ::

  • Điều đó có nghĩa là language specifictriển khai? chẳng hạn như nếu tôi sử e.getLocalizedMessage()dụng ứng dụng của tôi chẳng hạn English- lỗi sẽ được đưa vào English, nếu tôi sử dụng ứng dụng của mình Spanish- thì lỗi sẽ được đưa vàoSpanish

  • Cần một số giải thích rõ ràng về địa điểm và thời điểm tôi có thể sử dụng các phương pháp này để sử dụng


1
Có, nó có nghĩa là triển khai cụ thể theo ngôn ngữ (ngôn ngữ, văn hóa). Có gì sai với tài liệu chính thức ?
ngôn ngữ mặc định,

Câu trả lời:


71

Như mọi người đã đề cập ở trên -

Theo sự hiểu biết của tôi, hãy getMessage()trả về tên của ngoại lệ. getLocalizedMessage()trả về tên của ngoại lệ bằng ngôn ngữ địa phương của người dùng (tiếng Trung, tiếng Nhật, v.v.). Để thực hiện việc này, lớp bạn đang gọi getLocalizedMessage()phải ghi đè getLocalizedMessage()phương thức. Nếu không, phương thức của một trong các siêu lớp của nó được gọi là phương thức theo mặc định chỉ trả về kết quả của getMessage.

Ngoài ra, tôi muốn đặt một số đoạn mã giải thích cách sử dụng nó.

Làm thế nào để sử dụng nó

Java không có gì kỳ diệu, nhưng nó cung cấp một cách giúp cuộc sống của chúng ta dễ dàng hơn. Để sử dụng getLocalizedMessage()hiệu quả, chúng ta phải ghi đè hành vi mặc định.

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 được sử dụng để địa phương hóa.

Trong ví dụ này, bạn phải đặt các tệp thuộc tính dành riêng cho ngôn ngữ trong loc/exc/testđường dẫn. Ví dụ:

message_fr.properties (chứa một số khóa và giá trị):

key1=this is key one in France

message.properties (chứa một số khóa và giá trị):

key1=this is key one in English

Bây giờ, chúng ta hãy giả định rằng lớp trình tạo ngoại lệ của chúng ta giống như

public class ExceptionGenerator {

    public void generateException() throws MyLocalizedThrowable {
        throw new MyLocalizedThrowable("key1");
    }
}

và lớp chính là:

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

Theo mặc định, nó sẽ trả về giá trị khóa "tiếng Anh" nếu bạn đang thực thi trong môi trường "tiếng Anh". Nếu bạn đặt cục bộ thành Pháp, bạn sẽ nhận được đầu ra từ tệp message_fr.

Khi nào sử dụng nó

Nếu ứng dụng của bạn cần hỗ trợ l10n / i18n, bạn cần sử dụng nó. Nhưng hầu hết ứng dụng không cần như vậy, vì hầu hết các thông báo lỗi không phải dành cho khách hàng cuối, mà dành cho kỹ sư hỗ trợ / kỹ sư phát triển.


6
"Theo hiểu biết của tôi, getMessage () trả về tên của ngoại lệ." Điều này chỉ là sai. Tên của Ngoại lệ được tìm thấy từ e.getClass().getSimpleName(). new NullPointerException().getMessage()trả về "null", không phải "NullPointerException".
Philip Whitehouse

Tuy nhiên, cái bẫy ở đây là phương pháp không thực sự lấy ngôn ngữ, vì vậy không phải lúc nào cũng có thể lấy được ngôn ngữ của người dùng. Đặc biệt, cách thực hiện ngoại lệ trong câu trả lời này sẽ chỉ bản địa hóa đúng ngoại lệ cho một ứng dụng GUI. Đối với ứng dụng phía máy chủ, ngôn ngữ mặc định của JVM không giống với ngôn ngữ của người dùng, vì vậy chính sách tốt nhất là không bao giờ gọi ResourceBundle.getBundle (String) và luôn cung cấp ngôn ngữ thực tế của người dùng. (Ví dụ, với các ứng dụng web, bạn thường nhận được thông tin về địa phương của người dùng trong một tiêu đề.)
Trejkaz

6

Nó thực sự đáng ngạc nhiên - Kiểm tra mã openJDK 7 của Throwable.java lớp .

Thực hiện getLocalizedMessagelà -

390     public String getLocalizedMessage() {
391         return getMessage();
392     }

Và sự bắt đầu getMessagelà -

376     public String getMessage() {
377         return detailMessage;
378     }

130     private String detailMessage;

Không có sự thay đổi trong cách áp dụng của cả hai phương pháp trừ tài liệu.


15
Tài liệu hướng dẫn rõ ràng rằng "Các lớp con có thể ghi đè phương thức này để tạo ra một thông báo theo ngôn ngữ cụ thể. Đối với các lớp con không ghi đè phương thức này, việc triển khai mặc định trả về cùng một kết quả là getMessage ()."
crazy4jesus,

2

Không. nó chắc chắn không có nghĩa là triển khai ngôn ngữ cụ thể. nó có nghĩa là các triển khai sử dụng cơ chế quốc tế hóa (hay còn gọi là i18n). xem trang này để biết thêm chi tiết về gói tài nguyên là gì và cách sử dụng chúng.

ý chính là bạn đặt bất kỳ văn bản nào vào các tệp tài nguyên, trong đó bạn có nhiều văn bản (một cho mỗi ngôn ngữ / ngôn ngữ / v.v.) và mã của bạn sử dụng một cơ chế để tra cứu văn bản trong tệp tài nguyên chính xác (liên kết tôi đã cung cấp đi vào chi tiết ).

khi nào và ở đâu điều này được sử dụng, điều đó hoàn toàn phụ thuộc vào bạn. thông thường bạn chỉ lo lắng về điều này khi bạn muốn đưa ra một ngoại lệ cho một người dùng không phải là kỹ thuật, những người có thể không biết tiếng Anh tốt. vì vậy, ví dụ: nếu bạn chỉ viết để ghi nhật ký (thường chỉ những người dùng kỹ thuật mới đọc và do đó không phải là mục tiêu i18n phổ biến) bạn sẽ làm:

try {
   somethingDangerous();
} catch (Exception e) {
   log.error("got this: "+e.getMessage());
}

nhưng nếu bạn định hiển thị thông báo ngoại lệ trên màn hình (chẳng hạn như một đoạn hội thoại nhỏ) thì bạn có thể muốn hiển thị thông báo bằng ngôn ngữ địa phương:

try {
   somethingDangerous();
} catch (Exception e) {
   JOptionPane.showMessageDialog(frame,
    e.getLocalizedMessage(),
    "Error",  <---- also best be taken from i18n
    JOptionPane.ERROR_MESSAGE);
}

2
public String  getMessage() 

Trả về chuỗi thông báo chi tiết của tệp có thể ném này.

public String getLocalizedMessage() 

Tạo mô tả bản địa hóa về vật có thể ném này. Các lớp con có thể ghi đè phương thức này để tạo ra một thông báo theo ngôn ngữ cụ thể. Đối với các lớp con không ghi đè phương thức này, việc triển khai mặc định trả về kết quả giống nhưgetMessage() .

Trong trường hợp của bạn e không là gì ngoài đối tượng ngoại lệ ...

getLocalizedMessage() u cần ghi đè và đưa ra thông điệp của riêng bạn tức là ý nghĩa của thông điệp được bản địa hóa.

Ví dụ ... nếu có một ngoại lệ con trỏ null ...

Bằng cách in e nó sẽ hiển thị null

e.getMessage() ---> NullPointerException

2

Đây là những gì lớp Throwable.java phải nói. Có thể nó có thể giúp ai đó:

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

-2

Theo hiểu biết của tôi, getMessage trả về tên của ngoại lệ. getLocalizedMessage trả về tên của ngoại lệ bằng ngôn ngữ địa phương của người dùng (tiếng Trung, tiếng Nhật, v.v.). Để làm cho điều này hoạt động, lớp bạn đang gọi getLocalizedMessage trên phải ghi đè phương thức getLocalizedMessage. Nếu không, phương thức của một trong các siêu lớp của nó được gọi là phương thức theo mặc định chỉ trả về kết quả của getMessage.

Vì vậy, trong hầu hết các trường hợp, kết quả sẽ giống nhau nhưng trong một số trường hợp, nó sẽ trả về tên ngoại lệ bằng ngôn ngữ của vùng mà chương trình đang được chạy.

Điều đó có nghĩa là triển khai ngôn ngữ cụ thể? chẳng hạn như nếu tôi sử dụng e.getLocalizedMessage (), chẳng hạn như ứng dụng của tôi bằng tiếng Anh - lỗi sẽ xuất hiện bằng tiếng Anh, nếu tôi sử dụng ứng dụng của mình bằng tiếng Tây Ban Nha - thì lỗi sẽ xuất hiện bằng tiếng Tây Ban Nha

public String 
getMessage() 

Returns the detail message string of this throwable.





public String 
getLocalizedMessage() 

Tạo mô tả bản địa hóa về vật có thể ném này. Các lớp con có thể ghi đè phương thức này để tạo ra một thông báo theo ngôn ngữ cụ thể. Đối với các lớp con không ghi đè phương thức này, việc triển khai mặc định trả về kết quả giống như getMessage ().

Trong trường hợp của bạn e không là gì ngoài đối tượng ngoại lệ ...

getLocalizedMessage() u need to override and give your own message i.e 
the meaning for localized message. 

Ví dụ ... nếu có một ngoại lệ con trỏ null ...

Bằng cách in e nó sẽ hiển thị null

e.getMessage() ---> NullPointerException 

Đọc thêm...


-2

Theo sự hiểu biết của tôi, getMessage trả về tên của ngoại lệ.

getLocalizedMessage trả về tên của ngoại lệ bằng ngôn ngữ địa phương của người dùng (tiếng Trung, tiếng Nhật, v.v.).

Để làm cho điều này hoạt động, lớp bạn đang gọi getLocalizedMessagephải ghi đègetLocalizedMessage phương thức.

Nếu không, phương thức của một trong các siêu lớp của nó được gọi là phương thức theo mặc định chỉ trả về kết quả là getMessage.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.