匿名线程的例外情况

时间:2010-10-31 11:57:15

标签: java javadoc

我尝试用异常包围我的代码所以我不会有任何内存泄漏。 我尝试了以下代码,由于某种原因,异常没有被处理,我得到运行时错误。

一些代码:

   try
        {
            methodA();
        } catch (Throwable th)
        {
            MsgProxyLogger.error(TAG, th.getMessage());
        }
    }


 protected void methodA()
 {


            Thread disptacherThread = new Thread()
            {

                @Override
                public void run()
                {
                    dispatcher.dispatch(existingMessagesArr);
                }
            };
            disptacherThread.start();
   }  

现在如果某个运行时异常出现在线程内部,那么它不会被引入throable子句中吗?

为什么?匿名线程正在取消catch子句吗?

谢谢,

射线。

2 个答案:

答案 0 :(得分:1)

不幸的是没有。

try-catch块只能捕获Thread.Start()方法(即内存不足)。但是一旦线程启动或更好,已安排启动,您将失去对它的控制。

如果非处理异常超出了线程范围,则JVM将崩溃。你应该用try-catch包围你的内部匿名方法。

希望得到帮助。

答案 1 :(得分:0)

  

现在如果线程内部发生了某些运行时异常,它将不会被捕获到throwable子句中吗?

这是正确的。 try / catch只能捕获当前线程抛出的异常。匿名Runnable的run方法中的代码在不同的线程上执行。

有两种解决方案:

  • try方法中加catch / run来处理异常。
  • 使用子线程或UncaughtExceptionHandler
  • 注册ThreadGroup

顺便提一下,如果您担心导致资源泄漏的异常,最好的解决方案是使用以下模式编写代码:

    Resource r = // allocate resource
    try {
        // use resource r
    } catch (...) {
        ...
    } finally {
        // release resource r
    }

简单地捕获和记录异常(如示例代码所做的那样)将无法解决资源泄漏问题。