2010-10-31 67 views
0

即時嘗試圍繞我的代碼與異常遍及所以我不會有任何內存泄漏。 我嘗試了下面的代碼,出於某種原因異常沒有被處理,我得到運行時錯誤。例外與匿名線程

一些代碼:

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(); 
    } 

現在,如果一些運行時異常occurse線程內,它不會在throable條款抓?

這是爲什麼?匿名線程是否取消catch子句?

謝謝,

ray。

回答

0

現在,如果在線程內發生一些運行時異常,它不會被throwable子句捕獲?

這是正確的。 A try/catch只能捕獲當前線程拋出的異常。匿名Runnable的run方法中的代碼在不同的線程上執行。

有兩個解決辦法:

  • 將一個try/catchrun方法來處理異常。
  • 註冊的UncaughtExceptionHandler或者與子線程,或者其ThreadGroup

順便說一句,如果你關心導致資源泄漏的異常,最好的解決辦法是使用這種模式編寫代碼:

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

簡單地捕捉和記錄異常(如您的示例代碼執行)會不能治癒資源泄漏。

1

不幸的不是。

的try-catch塊是能夠趕上僅達Thread.Start()方法(即出的存儲器)。但是一旦線程啓動,或者更好,已經計劃開始​​,您將失去對它的控制。

如果unhandlex例外而來的線程範圍之外的JVM會崩潰。你應該用try-catch來包圍你的內部匿名方法。

希望能有所幫助。