2009-04-11 33 views
8

Tôi có ứng dụng Swing và mặc dù tôi có mọi thứ trong một số try/block, ngoại lệ không bị bắt.Làm thế nào để bắt ngoại lệ này trong Swing?

public static void main(String[] args) { 

    try { 
     App app = new App(); 
     app.setVisible(true); 

    } catch (Throwable e) { 
     System.err.println("never printed"); 
    } 
} 

tất cả tôi nhận được là chồng này dấu vết:

Exception in thread "AWT-EventQueue-0" 
java.lang.ArrayIndexOutOfBoundsException: 
9 >= 9 
at java.util.Vector.elementAt(Vector.java:427) 
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:633) 
at javax.swing.JTable.getValueAt(JTable.java:2695) 
at javax.swing.JTable.prepareRenderer(JTable.java:5712) 
at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2075) 
at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1977) 
at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1773) 
at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143) 
at javax.swing.JComponent.paintComponent(JComponent.java:763) 
at javax.swing.JComponent.paint(JComponent.java:1027) 
at javax.swing.JComponent.paintChildren(JComponent.java:864) 
at javax.swing.JComponent.paint(JComponent.java:1036) 
at javax.swing.JViewport.paint(JViewport.java:747) 
at javax.swing.JComponent.paintChildren(JComponent.java:864) 
at javax.swing.JComponent.paint(JComponent.java:1036) 
at javax.swing.JComponent.paintChildren(JComponent.java:864) 
at javax.swing.JComponent.paint(JComponent.java:1036) 
at javax.swing.JComponent.paintChildren(JComponent.java:864) 
at javax.swing.JComponent.paint(JComponent.java:1036) 
at javax.swing.JLayeredPane.paint(JLayeredPane.java:564) 
at javax.swing.JComponent.paintChildren(JComponent.java:864) 
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5129) 
at javax.swing.BufferStrategyPaintManager.paint 
(BufferStrategyPaintManager.java:277) 
at javax.swing.RepaintManager.paint(RepaintManager.java:1217) 
at javax.swing.JComponent.paint(JComponent.java:1013) 
at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21) 
at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60) 
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97) 
at java.awt.Container.paint(Container.java:1780) 
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) 
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714) 
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694) 
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run 
(SystemEventQueueUtilities.java:128) 
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
at java.awt.EventDispatchThread.pumpOneEventForFilters 
(EventDispatchThread.java:269) 
at java.awt.EventDispatchThread.pumpEventsForFilter 
(EventDispatchThread.java:184) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy 
(EventDispatchThread.java:174) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+0

Tôi sẽ đoán rằng bạn có một mạng lưới ở đâu đó ngay – geowa4

+0

Đây là một JTable :) – feiroox

Trả lời

10

Như đã đề cập trong một áp phích khác, vấn đề của bạn là ngoại lệ đang được ném vào một chuỗi khác, chuỗi gửi sự kiện. Một vài giải pháp:

  • đặt thử/nắm bắt xung quanh mã thực tế nơi ngoại lệ xảy ra: ví dụ: nếu nó đáp ứng với một nút bấm được xử lý bởi một ActionListener, hãy đặt try/catch bên trong phương thức actionPerformed() của bạn;
  • hoặc, để ngoại lệ dưới dạng ngoại lệ chưa được nắm bắt và thêm uncaught exception handler. Ví dụ:

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

Trên một lưu ý phụ, bạn nên về nguyên tắc nhưng mã khởi động giao diện người dùng của bạn trong một SwingUtilities.invokeLater().

+0

cảm ơn bạn đã ghi chú bên :) – feiroox

+1

Có ai đó thực sự bao giờ bắt gặp bất kỳ ngoại lệ ném trong EDT bằng cách sử dụng Thread.setDefaultUncaughtExceptionHandler()? Tôi nghiêm túc nghi ngờ (ít nhất là trên JDK5, đã không kiểm tra trên JDK6) vì EDT bắt tất cả các trường hợp ngoại lệ của chính nó và chỉ phát hành một printStackTrace() để System.err. – jfpoilpret

+1

Trong JDK 6 ít nhất, nó xuất hiện để "đúng" đi qua xử lý ngoại lệ chưa nắm bắt. Tôi thú nhận rằng tôi đã không nhận ra đây là thứ đã thay đổi từ 5 đến 6, nhưng có thể. –

2

Swing chạy mọi thứ trong trường hợp dispatching thread. Bạn đang cố gắng nắm bắt nó trong chủ đề chính.

Và lưu ý rằng xích đu không phải là chủ đề an toàn, bạn cũng nên làm mọi thứ trong chuỗi gửi sự kiện.

Để bắt ngoại lệ, bạn có thể ghi đè một số phương thức từ theo dõi ngăn xếp đó, như phương pháp vẽ từ thành phần của bạn.

Và đối với tôi ngoại lệ đó trông giống như một lỗi bạn nên sửa, không phải thứ bạn nên ẩn bằng cách đánh bắt.

+0

Và làm thế nào để nắm bắt là nó có thể? – feiroox

+0

có thể giúp, tôi không phải là chuyên gia Java: http://ruben42.wordpress.com/2009/03/30/catching-all-runtime-exceptions-in-swing/ – boj

0

Như đã đề cập ở trên, sự cố là nơi ngoại lệ được ném - trên chuỗi gửi sự kiện.

Nếu bạn muốn thiết lập khối thử/nắm bắt để nắm bắt vấn đề cụ thể này, tôi sẽ ném một thứ vào phương thức vẽ của lớp Ứng dụng. Ghi đè lên nó và đặt một cuộc gọi đến super.paint trong một khối try try there.

Nếu bạn muốn có một cách chung để bắt ngoại lệ không bị bắt, hãy xem Thread.setUncaughtExceptionHandler. Bạn gọi phương thức đó với một trình xử lý ngoại lệ và bạn có thể xử lý tất cả các ngoại lệ mà không bị bắt trong ứng dụng của bạn.

2

Trường hợp ngoại lệ thời gian chạy như ArrayIndexOutOfBoundsException cho thấy lỗi lập trình viên. Vì vậy, nó có thể là tốt hơn để sửa chữa chúng thay vì bắt và âm thầm nhai nó.

Chỉ cần đoán ngẫu nhiên về nguyên nhân ngoại lệ. Một cái gì đó đồng thời loại bỏ các hàng từ datavector của mô hình bảng khi JTable bắt đầu vẽ dữ liệu trên màn hình.

+0

Bạn nói đúng, nhưng tôi đang sử dụng thư viện mà nhai ngoại lệ cho tôi. Vì vậy khi bảng được rút ra tôi nhận được ngoại lệ. Nhưng dù sao tôi cũng muốn biết tôi có thể làm gì. Tôi có thể sửa chữa các thư viện không chắc chắn biết. Liên kết – feiroox

1

Các chỉ cách phù hợp mà tôi biết, để bắt ngoại lệ ném từ bên trong EDT là:

  • viết EventQueue của riêng bạn (Tôi woudln't tư vấn cho nó nói chung)
  • sử dụng thuộc tính nội bộ Swing "sun.awt.exception.handler" (Tôi sử dụng và nó hoạt động trên tất cả Sun JDK 1.4, 1,5 và 1.Ít nhất, ít nhất là trên IBM JDK 1.4 và 1.5 ít nhất; Tôi đã không kiểm tra nó trên JDK khác mặc dù)

Bạn nên xem this thread để có cái nhìn tổng quan hơn về các giải pháp với ưu và nhược điểm của chúng.

+0

đã chết ... –

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