IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Exceptions и Threads в Java (http://www.imho.ws/showthread.php?t=126225)

tvcool 23.11.2007 17:53

Exceptions и Threads в Java
 
Как кинуть exception из thread-а ?
И как его поймать в thread-е из которого кидающий thread был запущен?

EjikVTumane 24.11.2007 13:04

Исключения которые не обрабатываются в потоке из которого они были брошены ловятся следующим образом:

Можно также установить обработчик исключений по-умолчанию для всех создаваемых потоков: Thread.setUncaughtExceptionHandler.
Код:

package test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.Thread.UncaughtExceptionHandler;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {

        private static UncaughtExceptionHandler uncaughtExceptionHandler;

        private static JFrame frame;

        private static JLabel infoLabel;
       
        private static int i;
       
        public static void main(String[] args) {

                uncaughtExceptionHandler = new ExceptionHandler();

                frame = new JFrame();
               
                JPanel panel;
                panel = new JPanel();
               
                infoLabel = new JLabel();
               
               
                JButton threadLaunchButton;
                threadLaunchButton = new JButton();

                panel.add(threadLaunchButton, BorderLayout.CENTER);
                panel.add(infoLabel, BorderLayout.NORTH);
               
                threadLaunchButton.setAction(new ThreadLaunchAction());
               
                frame.setContentPane(panel);
                frame.setSize(600, 400);
                frame.addWindowListener(new MainFrameCloseHandler());
               
                frame.setVisible(true);
        }
       
        private static final class ExceptionHandler implements
                        UncaughtExceptionHandler {
                public void uncaughtException(Thread t, Throwable e) {
                        infoLabel.setText("Exception with message: '" + e.getMessage() + "' was caught (" + i + ")!");
                        i++;
                       
                }
        }

        private static final class MainFrameCloseHandler extends WindowAdapter {
                @Override
                public void windowClosing(WindowEvent e) {
                        System.exit(0);
                }
        }

        @SuppressWarnings("serial")
        private static final class ThreadLaunchAction extends AbstractAction {

                public ThreadLaunchAction() {
                        super("Throw exception");
                }
               
                public void actionPerformed(ActionEvent e) {
                       
                        Thread t;
                        t = new Thread(new Runnable()
                        {
                                public void run()
                                {
                                        throw new RuntimeException("I am exception from thread.");
                                }
                               
                        }, "Test thread");
                       
                        t.setUncaughtExceptionHandler(uncaughtExceptionHandler);
                        t.start();
                }
        }

}

Если тебе надо обрабатывать исключения, которые бросаются из Swing event thread, то это буедт делаться несколько по другому.


Часовой пояс GMT +4, время: 00:09.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.