秋千丢失异常

时间:2018-07-09 10:13:49

标签: java swing exception-handling

当我启动模态对话框并呈现异常时,该异常会消失。我可以在调用dialog.setVisible()的代码中捕获它吗?

P.S。我知道Thread.setUncaughtExceptionHandler,我需要从调用该对话框的代码中捕获它。

P.P.S。在此先感谢Andrey/。

public class TestSwing {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JDialog jDialog = new JDialog();
                    JTable table = new JTable();
                    table.setModel(new DefaultTableModel() {
                        @Override public int getColumnCount() {return 1;}
                        @Override public int getRowCount() {return 1;}
                        @Override
                        public Object getValueAt(int row, int column) {
                            throw new RuntimeException("Hello");
                        }
                    });

                    jDialog.add(table);
                    jDialog.setModal(true);
                    jDialog.pack();
                    jDialog.setVisible(true);

                    System.out.println("dialog closed");

                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("got it");
               }

           }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

不,您不能,因为异常不在对话框中,而是在线程中。 Dialog.setVisible()等到对话框变为不可见,但不要停止当前线程。但是我有一个窍门,可能会帮助您获得所需的行为。

public class TestSwing {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JDialog jDialog = new JDialog();
                    JTable table = new JTable();
                    table.setModel(new DefaultTableModel() {
                        @Override public int getColumnCount() {return 1;}
                        @Override public int getRowCount() {return 1;}
                        @Override
                        public Object getValueAt(int row, int column) {
                            throw new RuntimeException("Hello");
                        }
                    });

                    jDialog.add(table);
                    jDialog.setModal(true);
                    jDialog.pack();
                    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

                        @Override
                        public void uncaughtException(Thread t, Throwable e) {
                            jDialog.setVisible(false);
                            Thread.setDefaultUncaughtExceptionHandler(null);
                            throw new RuntimeException(e);
                        }
                    });
                    jDialog.setVisible(true);

                    System.out.println("dialog closed");

                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("got it");
               }

           }
        });
    }
}