2011-09-14 55 views
2

要求:如果有任何異常,請撥打重新驗證數據如何從java中的catch塊中調用方法?

的方法

我的實現:

private void one() { 
    try { 
     //Valid data 
    }catch(Exception e) { 
    two(); 
    } 
} 

private void two() { 
    //Process data with another input 
    //On entry, 
    one(); 
} 

我意識到,我的使用不正確。我應該如何處理這個問題?做你的方法one(), 使用數據之前,雖然它不是有效保持糾正,直到它是有效的,比給它one()這將是,在while循環別處 檢查數據的

+2

你爲什麼認爲這是「不正確的」? – Oded

+1

我希望這不是catch子句成爲「第二次嘗試」的情況。請你能解釋你想達到什麼目的? –

+0

我認爲不正確的原因是:如果在catch塊中有條件,那麼有** if(error)System.exit(0); ** 因此,一旦我從catch塊中調用one() ,之前的錯誤值仍然存在。因此,它退出應用程序 – dkulkarni

回答

5

您可以使用遞歸完全按照您的建議進行操作。我看不出有什麼問題。就個人而言,使用循環通常比使用遞歸更簡單。然而,我不會只捕獲所有的Exception。您可能想要以不同的方式處理不同的例外情況。

private void one() { 
    while(true) { 
    try { 
     //Valid data 
     break; 
    }catch(InvalidArgumentException e) { // or what ever you expect. 
     two(); 
    } 
    } 
} 

private void two() { 
    //Process data with another input 
    //On entry, 
} 

甚至

private void one() { 
    while(true) { 
    try { 
     //Valid data 
     break; 
    } catch(InvalidArgumentException e) { // or what ever you expect. 
     // Process data with another input 
     // On entry, 
    } 
    } 
} 
+2

+1我打算給出類似的答案:) –

+0

謝謝。我沒有意識到這種用法是正確的。我只是沒有處理好另一個條件。 – dkulkarni

1

更好的辦法。

問題您的意見後

讓你error變量是一個類級別和方法two()這樣的復位,

private void two() { 
    this.error = false; 
    //Process data with another input 
    //On entry, 
    one(); 
} 

祝你好運!

+0

它可能不可能'知道',因爲'one()'可能會操縱數據。「 – amit

+0

這就是」先驗證「與」嘗試讓它崩潰「的爭論。我想這取決於你認爲無效輸入的頻率。驗證結果是不必要的。 – Thilo

+0

@SkeetOverFlow - 是的,這看起來像是處理錯誤的更優化方式。謝謝 – dkulkarni

0

你在代碼中顯示的使用是正確的 - 是什麼讓你覺得這是不正確的?

但是,我看到你回想起原來的方法對我有意見的捕捉 -

  1. 如果不斷拋出異常,就會導致堆棧溢出。
  2. 您希望有一些預防性/不同的邏輯來檢查,除非這是與時間有關或在通話過程中每個條件發生了變化。
  3. 如果您陷入循環,您應該考慮退出條件。
+0

謝謝。我現在看到我出錯的地方。 – dkulkarni