2011-07-26 30 views
6

Tôi đang làm việc với javax.swing để tạo một ứng dụng tạo biểu mẫu từ Lược đồ XML (sử dụng thư viện JAXFront) và lưu trữ dữ liệu được người dùng điền vào tài liệu XML.Bắt ngoại lệ trong ứng dụng javax.swing

Tôi đã đặt các khối try-catch-finally khi cần, nhưng tôi có một vấn đề nhỏ khi bắt buộc ngoại lệ khi chủ đề chính kết thúc (Chủ đề AWT vẫn đang chạy).

Tôi có hai lớp học mà làm công việc chính và các lớp khác mà không phải là quan trọng đối với câu hỏi:

  • lớp Main: Nó có cấu trúc sau. Khởi tạo các ứng dụng và chạy các khung chính

    public class Main { 
        public static void main(String[] args) { 
         readArgs(); // An INI file with the app config 
         Model model = initializeElements(args); // My model class 
         try { 
          MyFrame mfr = new MyFrame(title,model); 
          mfr.visualize(); // Assembling view and setting visible 
         } catch(Excepion e) { 
          doCleanUp(); 
          System.exit(-1); 
         } 
        } 
    }
  • Khung Lớp: Tạo quan điểm và lắng nghe sự kiện

    public class MyFrame extends JFrame implements ActionListener,MenuListener { 
        // Some attributes 
        // Other mthods without importance 
        /** 
        * Compose the elements, add listeners and set visible the frame 
        */ 
        public void visualize() { 
         generateFormPanel(); 
         setListeners(); 
         validate(); 
         setVisible(true); 
        } 
    
        public MyFrame(String title, Modele model) { 
         super(title); 
         createElementsUsing(model); 
        } 
    
        public void actionPerformed(ActionEvent e) { 
         // Code to manage events 
        } 
    }

Vâng, vấn đề là như sau: Khi chức năng trực quan hóa được thoát khỏi phương thức chính, khung nhìn được tạo ra và hiển thị. Tại thời điểm đó là khi tôi mất kiểm soát các trường hợp ngoại lệ bắt. Sau đó, câu hỏi của tôi là nếu có một số cách để nắm bắt RuntimeExceptions có thể được ném sau thời điểm này.

Tôi hy vọng bạn hiểu tiếng Anh của tôi và có thể trả lời câu hỏi.

Xin cảm ơn trước.

Trả lời

19

đơn giản phiên bản là để thiết lập mặc định uncaught exception handler:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    public void uncaughtException(Thread t, Throwable e) { 
     // do something 
    } 
}); 

Nhưng mà bắt ngoại lệ còn tự do ném vào các phần khác của chương trình là tốt.

Bạn tuy nhiên có thể bắt chỉ ngoại lệ runtime ném ra khỏi sự kiện xoay dispatching thread sử dụng một proxy (Xem this trang để biết thêm thông tin, mã được sao chép từ đó):

class EventQueueProxy extends EventQueue { 

    protected void dispatchEvent(AWTEvent newEvent) { 
     try { 
      super.dispatchEvent(newEvent); 
     } catch (Throwable t) { 
      // do something more useful than: t.printStackTrace(); 
     } 
    } 
} 

Bây giờ cài đặt nó như thế này:

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueueProxy()); 
+0

Cảm ơn rất nhiều. Giải pháp đầu tiên của bạn giải quyết probelm của tôi. Tôi không thể bỏ phiếu cho bạn, nhưng hãy lấy nó! – Charliemops

1

Sau khi bạn đã gọi visualize() chuỗi chỉ chạy là chuỗi gửi sự kiện Swing/AWT. Nếu bạn muốn bắt bất kỳ ngoại lệ nào, bạn sẽ cần phải làm như vậy trong bất kỳ phương pháp người nghe nào được gọi trên chủ đề này, ví dụ:

public void actionPerformed(ActionEvent e) { 
    try { 
    // Some code here 
    } catch(RuntimeException e) { 
    // Handling code here 
    } 
} 

Để ngăn chặn bản in, bạn có thể có mã này trong lớp học siêu hạng.

Lưu ý rằng bạn cũng có thể đặt default uncaught exception handler nếu bạn muốn bắt bất kỳ thứ gì chưa được xử lý bởi chuỗi Swing/AWT.

Lưu ý rằng nhìn chung, cách tốt nhất là không bắt các lớp con của RuntimeException nếu bạn có thể tránh nó.

0

Hãy thử thêm:

setDefaultCloseOperation(EXIT_ON_CLOSE); 

để MyFrame constructor. Không chắc chắn mặc dù, nhưng giá trị cố gắng.

+0

Để kiểm soát các sự kiện thoát, tôi có 'setDefaultCloseOperation (DO_NOTHING_ON_CLOSE);' và 'addWindowListener (new WindowAdapter() {...});' mà làm sạch. – Charliemops

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