代码之家  ›  专栏  ›  技术社区  ›  rayman

匿名线程例外

  •  0
  • rayman  · 技术社区  · 15 年前

    我试着将我的代码用异常包围起来,这样我就不会有任何内存泄漏。 我尝试了下面的代码,出于某种原因,这个异常没有被处理,我得到了运行时错误。

    一些代码:

       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 回复  |  直到 15 年前
        1
  •  0
  •   Stephen C    15 年前

    现在,如果在线程内部发生了一些运行时异常,它就不会被捕获在可丢弃的子句中?

    没错。一 try / catch 只能捕获当前线程引发的异常。匿名可运行文件中的代码 run 方法在其他线程上执行。

    有两种解决方案:

    • 放一个 尝试 / 抓住 运行 处理异常的方法。
    • 注册一个 UncaughtExceptionHandler 或者使用子线程,或者 ThreadGroup .

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

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

    简单地捕获和记录异常(如示例代码所做)并不能解决资源泄漏问题。

        2
  •  1
  •   usr-local-ΕΨΗΕΛΩΝ    15 年前

    不幸的是,没有。

    try catch块只能捕获到thread.start()方法(即内存不足)。但一旦线程启动,或者更好, 已安排开始 你将失去对它的控制。

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

    希望能得到帮助。