Поймать исключения в приложении javax.swing - PullRequest
6 голосов
/ 26 июля 2011

Я работаю с javax.swing, чтобы создать приложение, которое генерирует формы из XML-схемы (используя библиотеку JAXFront) и сохраняет заполненные пользователем данные в XML-документах.

Я поставил try-catch-finally блокирует, когда мне это нужно, но у меня есть небольшая проблема с перехватом исключений, когда основной поток заканчивается (потоки AWT все еще работают).

У меня есть два класса, которые выполняют основную работу, и другие классы,не важны для вопроса:

  • Основной класс : имеет следующую структуру.Инициализирует приложение и запускает основной кадр

    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);
            }
        }
    }
  • Класс кадра : генерирует события просмотра и прослушивания

    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
        }
    }

Проблема в следующем: когда функция визуализации извлекается из основного метода, создается и отображается представление.В тот момент, когда я теряю контроль над ловлей исключений.Тогда у меня вопрос, если есть какой-то способ отловить возможные исключения RuntimeException, выданные после этой точки .

Я надеюсь, что вы понимаете мой английский и можете ответить на вопрос.заранее.

Ответы [ 3 ]

23 голосов
/ 26 июля 2011

Простейшая версия - установить обработчик необработанных исключений по умолчанию:

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

Но это ловит неисчислимые исключения, возникающие и в других частях программы.

Однако вы можете отлавливать только исключения времени выполнения, выбрасываемые из потока диспетчеризации событий свинга с использованием прокси-сервера (см. эту страницу для получения дополнительной информации, скопированный код оттуда):

class EventQueueProxy extends EventQueue {

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

Теперь установите его так:

Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueueProxy());
1 голос
/ 26 июля 2011

После того, как вы вызвали visualize(), единственный запущенный поток - поток диспетчеризации событий Swing / AWT.Если вы хотите перехватить какие-либо исключения, вам нужно будет сделать это в любом из ваших методов слушателя, которые вызываются в этом потоке, например,

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

Чтобы предотвратить шаблон, вы можете иметь этот код в суперклассе.

Обратите внимание, что вы также можете установить обработчик необработанных исключений по умолчанию , если вы хотите перехватить что-то, с чем еще не сталкивался поток Swing / AWT.

Обратите внимание, что в целом этоРекомендуется не перехватывать подклассы RuntimeException, если вы можете избежать этого.

0 голосов
/ 26 июля 2011

Попробуйте добавить:

setDefaultCloseOperation(EXIT_ON_CLOSE);

конструктору MyFrame. Не уверен, но стоит попробовать.

...