2011-06-21 48 views
1

我的活動,在的onCreate()我嘗試獲取數據:catch異常

protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     ............... 
     fillUI(); 
    } 

public void getDetailedItem(){ 
     FeedParser parser=new FeedParser(); 
     try{ 
      mItem=parser.parseDetailed(); 
     }catch(Exception e){ 
      closeAndShowError(); 
     } 
    } 

    public void fillUI(){ 
     getDetailedItem(); 
     if(mItem!=null){ 
     ............... 
     }else{ 
      closeAndShowError(); 
     } 
    } 

private void closeAndShowError(){ 
     Context context = getApplicationContext(); 
     CharSequence text = getResources().getString(R.string.toast_error); 
     int duration = Toast.LENGTH_SHORT; 

     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 

     finish(); 
    } 

他們的問題是,當異常occures,它被抓住了,我希望我的活動來完成本身,但我還是在fillUI()裏面執行代碼,所以我必須在getDetailedItem()後面加上if語句; 我該如何解決它?

+0

你能捕捉到了異常詮釋他'fillUI()'方法? – spot35

回答

1

你可以做這樣的事情:

public void getDetailedItem(){ 
     FeedParser parser=new FeedParser(); 
     try{ 
      mItem=parser.parseDetailed(); 
     }catch(Exception e){ 
      mItem = null; 
     } 
} 

然後在fillUI()如果mItemnull告訴你的錯誤;

0

finish()聲明不是立即返回,您的代碼會繼續運行,直到它確定它已完成。您需要給自己留下一個異常指標,並在發生時通過呼叫鏈返回,而不是繼續運行。

0

由於您正在捕捉異常, fillUI()函數不會收到任何錯誤的通知。

你的代碼路徑是如下: fillUI - > getDetailedItem - >異常捕獲 - > closeAndShowError - >完成() - >回closeAndShowError - >回getDetailedItem抓獲塊 - >返回到fillUI。

所以基本上,fillUI中的getDetailedItem之後的代碼被調用是因爲你發現了異常並且沒有讓其他函數知道。要麼通過返回值,要麼拋出(也許捕捉)一個新的異常。

0

finish()會導致Activity停止作爲其生命週期的下一個步驟。但是在你稱之爲的時候,它仍處於另一個生命週期階段:onCreate()。不知何故,它不會立即退出方法。

這就是答案,但更好的做法是重新設計你的代碼。如果你正在處理這樣的問題,這可能不是處理它的最乾淨的方式。

1

您可以通過有可能會被扔在parseDetailedfillUI方法例外:

public void getDetailedItem() throws Exception { 
    FeedParser parser=new FeedParser(); 
    mItem=parser.parseDetailed(); 
} 

public void fillUI(){ 
    try { 
     getDetailedItem(); 
     // rest of your code.. 
    } catch(Exception e) { 
     closeAndShowError(); 
    } 
}