Поймай Исключение из Нити - PullRequest
0 голосов
/ 30 апреля 2011

Мне нужно перехватить исключение вне потока, возникшее во время работы потока.
Я пытался выдать новое исключение, но оно показывает мне ошибку, что «незарегистрированное исключение ... должно быть перехвачено или объявлено как выброшенное». если это невозможно, то почему? если вы можете объяснить причину.

вот мой код

try {


            log("Connecting to Module..");
            int no = searchdevices.getSelectedIndex();
            String Selectaddress = searchdevices.getString(no);
            String name = Selectaddress.substring(0, 6);
            String add = Selectaddress.substring(Selectaddress.indexOf("$") + 1);
            if (no == -1) {
                Alert al = new Alert("Warning", "" + no, null, AlertType.WARNING);
                al.setTimeout(3000);
                display.setCurrent(al);
            }
            final String fdata2 = "btspp://" + add + ":1;master=false;encrypt=false;authenticate=false";
            finalurl = fdata2;
            fbtname = name;
            // fbtadd = add;
            new Thread(new Runnable() {

                public void run() {
                    try {

                        isConnOpen = true;
                        stream = (StreamConnection) Connector.open(fdata2);
                        in = stream.openInputStream();
                        out = stream.openOutputStream();
                        url2 = fdata2;

                        GoTo_Success();

                    } catch (IOException ex) {

                      throw new Exception();//in side exception 
                    }
                }
            }).start();
        } catch (Exception e) {
            log("Please switch on bluetooth and then try again"); // want to catch here..
        }

Спасибо.

Ответы [ 4 ]

1 голос
/ 30 апреля 2011

Хорошо, если поток работает одновременно с вашим кодом, как он может перехватить исключение? Как только вы вызываете start (), поток запускается (ну, возможно, в какой-то момент после этого вызова), и остальная часть программы перемещается дальше ловушки.

Скажем, например, поток создается и запускается методом, называемым "foo". Как только вы начинаете, метод foo достигает конца и возвращается к тому, что вызвало его. Это тогда вызывает метод "бар". В этот момент запланирован запуск нового потока, поэтому метод "bar" приостановлен, а метод запуска в потоке выполнен. Теперь исключение случается. Программа очень далека от улова, который вы пытаетесь получить. Даже если бы эта часть программы не спала.

1 голос
/ 30 апреля 2011

Когда вы генерируете новое исключение в catch, вы должны обработать его, окружив его try..catch.

Попробуйте это:

new Thread(new Runnable() {

             public void run() {
                 try {

                     isConnOpen = true;
                     stream = (StreamConnection) Connector.open(fdata2);
                     in = stream.openInputStream();
                     out = stream.openOutputStream();
                     url2 = fdata2;

                     GoTo_Success();

                 } catch (IOException ex) {

                   try {
                    throw new Exception();
                } catch (Exception e) {
                    e.printStackTrace();
                }//in side exception 
                 }
             }
         }).start();
0 голосов
/ 30 апреля 2011

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

Одним из примеров может быть использование Queue<Exception> или чего-то подобного, и ваши рабочие потоки перехватят любое возникающее исключение и добавят его в очередь.

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

0 голосов
/ 30 апреля 2011

Исключение должно быть объявлено в объявлении метода с использованием предложения throws, только тогда вы можете использовать throw new Exception();

Если вы увидите Thread.run(), то обнаружите, что нет условия throws Exception. Поэтому вы получите ошибку компиляции.

Смотрите эти ссылки:

  1. http://pages.cs.wisc.edu/~cs368-1/JavaTutorial/NOTES/Exceptions.html
  2. http://download.oracle.com/javase/tutorial/essential/exceptions/
...