2010-11-02 28 views
16

Tôi đang viết chương trình sử dụng java.net.URLDecoder.decode(String value, String encoding). Rõ ràng, phương pháp này có thể ném một UnsupportedEncodingException, mà tôi nhận được. Nhưng tôi chỉ chuyển "UTF-8" làm bảng mã. Nó sẽ không ném ngoại lệ đó.Nhưng tôi không _want_ để bao quanh các tuyên bố với một khối try/catch!

Tôi chỉ có thể bao quanh điều darn với khối catch không có gì, nhưng sau đó trong bất kỳ trường hợp quái dị nào gây ra ngoại lệ được ném, tôi sẽ không tìm hiểu về nó. Tôi cũng không muốn tạo một chuỗi lớn gồm throws UnsupportedEncodingException lên đến đỉnh chương trình của mình.

Tôi có thể làm gì ở đây? Tại sao tôi buộc phải đối phó với một số Ngoại lệ, trong khi những người khác (ví dụ: IllegalArgumentException, NullPointerException) Tôi được phép bỏ qua?

+2

Một lưu ý phụ, ngoại lệ bạn được phép bỏ qua thường là ngoại lệ mà bạn _should_ bỏ qua cho đến khi người xử lý bắt tất cả đăng nhập và chấm dứt duyên dáng. Các ngoại lệ sử dụng như IllegalArgumentException và NullPointerException chỉ ra các lỗi và trạng thái chương trình không ổn định.Mặt khác, các loại ngoại lệ được kiểm tra không nhất thiết gây tử vong, do đó, triết lý đằng sau các ngoại lệ đã kiểm tra yêu cầu bạn làm rõ một cách rõ ràng cách bạn muốn xử lý nó (ngay cả khi điều đó có nghĩa là xác nhận lỗi) người gọi. –

+0

@DanBryant: Đây là một trong những trường hợp điển hình. 99,99% người gọi vượt qua một hằng số ở đây. Ngoại lệ thực sự không thể xảy ra. – Joshua

Trả lời

25

Tôi nghĩ rằng bạn cần hiểu rõ hơn về ngoại lệ đã kiểm tra và mục đích của chúng nói chung, nhưng đó là dành cho another question and answer. Trong trường hợp này, những gì bạn làm là:

try { 
     //etc. 
} catch (UnsupportedEncodingException e) { 
     throw new RuntimeException(e.getMessage(), e); 
} 
+3

+1. Nhưng trên một mặt lưu ý: Điều này giả định bạn xem xét một UnsupportedEncodingException là rất quan trọng đối với Thread hiện tại. Nếu không, nếu chương trình của bạn xuất thông tin đăng nhập, bạn luôn có thể đăng nhập bằng một mức thích hợp để thay thế. – Valchris

+1

+1 Mã của tôi được lấp đầy với thời gian mã này. Đó là tẻ nhạt nhưng nó là cần thiết. Tốt hơn nhiều so với để cho các trường hợp ngoại lệ bong bóng lên ngăn xếp. –

+7

Giải pháp này là tốt, bởi vì nó làm cho rõ ràng rằng ngoại lệ kiểm tra UnsupportedEncodingException nên được hiểu là một lỗi (và do đó gây tử vong) nếu nó được ném trong bối cảnh này. –

4

Có hai loại ngoại lệ.

  • CheckedException: Bạn bắt buộc phải sử dụng try-catch hoặc ném lên đầu chương trình.
  • UncheckedException: Bạn có thể bỏ qua .. Nó sẽ tăng vào thời gian chạy chỉ

tôi chỉ chấp nhận sự thật rằng Java thiết kế như vậy để làm cho chương trình ít dễ bị lỗi.

+1

Một danh từ là gì? Đây có phải là một số tham chiếu đến Quận 9 không? ;) –

+0

Chỉ cần thêm, tất cả ngoại lệ trong java được kiểm tra, trừ khi chúng mở rộng RuntimeException. – Jeremy

1

Nếu điều này làm phiền bạn nhiều, thì bạn luôn có thể sử dụng biểu mẫu phản đối đơn, không được chấp nhận là URLDecoder.decode(). Điều này không có tham số encoding và không ném ngoại lệ đã chọn.

Tất nhiên, phương pháp này không được chấp nhận vì một lý do - hành vi của nó phụ thuộc vào mã hóa mặc định của JVM, có thể khác nhau tùy thuộc vào môi trường hoạt động. Nhưng nếu bạn biết rằng môi trường của bạn không thay đổi, điều này có thể không quan trọng. Ngoài ra còn có nguy cơ rằng phương pháp này sẽ bị xóa trong các phiên bản tương lai của Java, nhưng không có mục không được chấp nhận nào chưa được xóa và tôi nghi ngờ điều đó sẽ xảy ra.

1

UnsupportedEncodingException là ngoại lệ được kiểm tra theo phương thức URLDecoder.decode và bạn phải bắt nó hoặc chỉ định phương thức của bạn sẽ ném nó.

public static String decodeUTF8String(String s) throws UnsupportedEncodingException 
{ 
    return java.net.URLDecoder.decode(s, "UTF-8"); 
} 

A good lesson on exceptions

2

Một số người quấn RuntimeException để tránh trường hợp ngoại lệ kiểm tra. Tuy nhiên trong trường hợp của bạn, bạn biết ngoại lệ này không nên xảy ra. Để tâm trí của tôi đây là một khẳng định.

Một cách khác để tính lại ngoại lệ đã kiểm tra mà không cần gói nó là ném nó như thể nó là một ngoại lệ không được kiểm soát. Bạn có thể thử điều này.

try { 
    // throws a checked exception 
} catch (Exception e) { 
    Thread.currentThread().stop(e); 
} 
Các vấn đề liên quan