2014-01-23 114 views
0

我一直在試圖編寫Java異常處理程序一段時間,嘗試了多種方法,甚至訪問過/通過Oracle的「Java教程」閱讀,我仍然無法弄清楚它。我不確定我做錯了什麼。我有一個給定的類(TooLowException),用於我嘗試使用的異常。在我試圖使用它的方法中,我使用了一個參數,如果它小於零,我需要捕獲它。正確設置Java異常處理

public int func(int num) throws TooLowException { 
     int blah = num + 1; 
     if (blah < 0) { 
      return blah; 
     } 
     else { 
      String error = "Input is too low."; 
      throw new TooLowException(error); 
     } 
    } 

這是異常類:

public class TooLowException extends Exception { 
     public TooLowException(String response) { 
      super(response); 
     } 
    } 

我得到的錯誤在Oracle中 「未處理的異常類型TooLowException」。我也嘗試了try-catch方法,但它也不適用於我。希望這是足夠的信息讓某人指出我做錯了什麼。我需要正確處理異常處理的方式。

+1

哪裏是'嘗試/ catch'代碼? –

+1

你需要在調用'func(int)'的代碼中處理這個異常。 –

+0

要麼你需要在你的其他部分添加try catch塊,或者你必須添加的try/catch中的代碼,你在哪裏調用FUNC(NUM)的一部分。 – Vijay

回答

0

從你給出的信息看,你需要在你的代碼中有一個try/catch塊。基本上在你的應用程序的某個地方,func(int)方法被調用,或者如果你遇到一個編譯器錯誤,告訴你「未處理的異常類型TooLowException」,需要調用它。異常的一般規則是Handle/Catch或Declare。這可細分如下:

  • Handle /捕捉:如果您選擇處理異常,那麼 「throws」 聲明應該從方法簽名(「公衆詮釋FUNC(INT NUM)throws TooLowException be removed 「變成」public int func(int num)「)。這種方法背後的想法是,你作爲程序員打算處理這種類型的異常,因爲它對於不希望外部代碼必須擔心處理方法範圍之外的異常的方法具有足夠的特定性。這要求你使用try/catch塊自己「處理」異常。
  • 聲明:這是你的方法。你說的是任何類使用這個函數都有處理try/catch塊的異常的負擔。如果您編寫的方法足夠通用,以至於許多不同的應用程序都可以使用它,並且處理異常應該是特定於應用程序的,也就是說,由其他開發人員以他們自己的方式處理它,那麼將使用此方法。有些人喜歡只記錄事情,有些人喜歡在接收到某些例外情況時執行不同的控制流程。

這是有用的,對不起,如果它基本上回答你需要做的練習,但它是爲了幫助你!請花時間去了解這裏發生了什麼:

public class YourClassThisStuffIsIn { 

    public static int func(int num) throws TooLowException { 
      int blah = num + 1; 
      if (blah < 0) { 
       return blah; 
      } 
      else { 
       String error = "Input is too low."; 
       throw new Exception(error); 
      } 
     } 

    public static void main(String[] commandlineArgument){ 
     try { 
      YourClassThisStuffIsIn.func(3); 
     } catch (TooLowException tle){ 
      System.out.println("Caught " + e); 
     } 
    } 
} 

當您在IDE中單擊運行,或通過控制檯運行時,JVM查找具有正確的簽名的主要方法。在這種情況下,它找到它,並執行主要方法。第一行是一個嘗試,這意味着JVM必須爲應用程序中的問題做好準備,以便在發生異常時進行恢復。在這種情況下,唯一可拋出的異常是一個TooLowException,你已經寫了如何在catch塊中處理它。你處理它的方式只是簡單地打印出堆棧,這在我看來很好。

我已經稍微改變了你的例子,使得你的方法是靜態的,所以寫起來更快。我也懷疑這個意圖是commandLineArgument的意思是傳遞給func(int)方法的數字,所以在這種情況下,你看func方法看起來像func(Integer.parseInt(commandlineArgument [0] ))。

你的獎勵點注意到parseInt也會拋出一個NumberFormatException異常,但你當然會記得java.lang.RuntimeException及其子類不是檢查異常,所以不需要捕捉它們,雖然它很好實踐!

+0

把try/catch放在主要呼叫的周圍是我未能做到的事情......我衷心希望我能記住這一點。由於某種原因,每次查找有關異常的信息時,我都從未抓住主要'試圖捕捉'方法的'拋出'的信息;我一直在想,這些都是爲了保持在方法中。你的子彈解釋也非常有幫助。謝謝! – user3226375

+0

是的,想象整個過程鏈可能很難。基本上,任何被拋出的checked異常都需要被捕獲,無論是拋出它的方法(認爲Ground Zero)還是一直到調用堆棧的開始。你的func方法可以包含try/catch,或者拋出異常讓調用func的方法捕獲它。 – tehemperorer