2010-07-14 36 views
5

Tôi có một setter tĩnh được sử dụng để thiết lập tất cả các trường hợp của MyClass:Java: Tạo thành viên lớp tĩnh có nhà xây dựng có thể ném một ngoại lệ

public class MyClass { 
     .... 
    protected static final Setter setter = new Setter(); 
     ... 
} 

Tuy nhiên điều này không biên dịch từ các nhà xây dựng setter ném một ngoại lệ:

public class Setter { 

    public Setter() throws FileNotFoundException { 
      .... 
    } 
} 

Tôi làm cách nào để giải quyết vấn đề này?

+0

Nói chung nếu có điều gì ném một ngoại lệ kiểm tra, nó không phải là một cái gì đó mà bạn muốn lưu trữ trong một tĩnh. –

Trả lời

17

Các ExceptionInInitializerError được thiết kế cho mục đích này chính xác. Dưới đây là một trích dẫn liên quan đến các liên kết Javadoc:

Tín hiệu ngoại lệ không mong muốn đã xảy ra trong trình khởi chạy tĩnh. An ExceptionInInitializerError được ném ra để cho biết rằng một ngoại lệ xảy ra trong quá trình đánh giá bộ khởi tạo tĩnh hoặc bộ khởi tạo cho một biến tĩnh.

Bỏ nhiệm vụ vào khối khởi tạo tĩnh và xử lý tương ứng.

public class MyClass { 
    protected static final Setter setter; 

    static { 
     try { 
      setter = new Setter(); 
     } catch (FileNotFoundException e) { 
      throw new ExceptionInInitializerError(e); 
     } 
    } 
} 
2

Bạn có thể tạo nó trong một hàm tĩnh, miễn là bạn bắt được Ngoại lệ nó (có khả năng) tăng lên.

public class MyClass { 
    protected static final Setter setter = createSetter(); 

    protected static Setter createSetter() { 
     try { 
      return new Setter(); 
     } catch(FileNotFoundException e) { 
      // handle it appropriately 
      return null; 
     } 
    } 
} 

Không có cách nào để cho phép ngoại lệ lan truyền, vì nó làm tăng ngoại lệ đã kiểm tra (và điều đó bất hợp pháp trong quá trình khởi tạo). Có một vài cách để đối phó với điều đó:

  • Raise một ngoại lệ được kiểm soát: Điều này gây ra một java.lang.ExceptionInInitializerError để có được nâng lên khi nó cố gắng để tải lớp. Nó có thể gây nhầm lẫn và khó theo dõi và gỡ lỗi. Tôi không khuyên bạn nên.

  • Thay đổi thành biến không phải cuối cùng và tạo một chức năng để truy cập nó: Nếu biến không cuối cùng, bạn có thể kiểm tra xem nó có được đặt hay không và tăng ngoại lệ đã kiểm tra nếu không. Điều này cho phép (trên thực tế, đòi hỏi) mã của bạn để xử lý các ngoại lệ tại điểm mà nó được gọi là:


public class MyClass { 
    private static Setter setter; 

    protected static synchronized Setter getSetter() raises FileNotFoundException { 
     if setter == null { 
      setter = new Setter(); 
     } 

     return setter; 
    } 
} 
+0

nếu đó là lỗi nghiêm trọng và cần truyền bá thông tin gì? – sixtyfootersdude

+0

@sixtyfootersdude: quấn nó trong một đoạn trích không được kiểm soát. –

Các vấn đề liên quan