线程中的Catch Exception

时间:2011-04-30 05:43:33

标签: java java-me java-ee

我需要捕获线程运行时发生的线程异常。
我试图抛出新的异常,但它显示错误“未报告的异常......必须被捕获或声明被抛出”.2 如果不可能那么为什么? 如果你能解释原因。

这是我的代码

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 个答案:

答案 0 :(得分:1)

当你在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();

答案 1 :(得分:1)

假设一个线程在代码运行的同时运行,它怎么能捕获异常?一旦你调用start(),线程就会启动(好吧,在那个调用之后的某个时刻),程序的其余部分会继续执行catch。

例如,假设Thread是在名为“foo”的方法中创建并启动的。一旦你开始,foo方法到达结束并返回到任何调用它。然后调用方法“bar”。在那个时间点,新的Thread实际上被安排运行,因此挂起“bar”方法并执行Thread中的run方法。现在异常发生了。该计划距离你想要发生的捕获距离很远。即使不是程序的那部分就是睡着了。

答案 2 :(得分:0)

必须使用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/

答案 3 :(得分:0)

如果您希望获得有关另一个线程中的例外的通知,则必须手动传输例外。

一个例子是使用Queue<Exception>或类似的东西,你的工作线程会捕获任何异常并将其添加到队列中。

“主线程”(或特殊异常处理程序线程,或UI线程,或......)然后会定期轮询队列以查看是否有任何新异常,如果是,则可以显示它给用户。