2012-02-20 99 views
0

我傳入一個字符串到這個方法。字符串是「44」。然後,我將它解析爲一個int,並執行一條if語句來查看它是否在1和12之間。然後它轉到else語句所在的位置 - 拋出新的IllegalArgumentException(「非法的月份數字在這裏:」+ inSetString);錯誤的異常被拋出

出於某種原因,這不會被拋出,它會下降到下一個異常,並拋出一個 - 拋出新的IllegalArgumentException(「Invalid month name string:」+ inSetString);

爲什麼拋出第二個異常聲明但不是第一個?它會轉到else語句。我已經通過使用 - System.out.println(「except」+ inSetString)來測試它;

這裏是我的代碼:

public void setMonthName(String inSetString)  
{ 
     int i = 0; 
     monthNumber = -1; 

     try 
     { 
      System.out.println("first" + inSetString); 
      i = Integer.parseInt(inSetString); 
      System.out.println("next" + inSetString); 
      if (i >= 1 && i <= 12) 
      { 
       monthNumber = i; 
      } 
      else 
      { 
        System.out.println("except" + inSetString); 
       throw new IllegalArgumentException("Illegal month number here: " + inSetString); 
      } 
     } 
      catch (IllegalArgumentException e) 
      {  

      } 

     // if it gets to here we know it's a string 
     for (int index = 0; index < monthNames.length; index++) 
     { 
      if (monthNames[index].equalsIgnoreCase(inSetString)) 
      { 
       monthNumber = index; 
      } 
     } 
     if (monthNumber == -1) 
     { 
      throw new IllegalArgumentException("Invalid month name string: " + inSetString); 
     } 
     } 

回答

8

拋出異常,但你有一個catch塊不會做任何事情,並允許繼續執行。然後你到達另一個異常,那個程序崩潰。

嘗試在catch塊中添加一些日誌記錄(或e.printStackTrace()),您會看到會發生什麼情況。

此外,請嘗試使用IDE的調試器,而不是添加打印語句。您將更好地瞭解您的程序的執行情況。

+0

好的。謝謝回覆。如何讓它拋出else語句中的第一個IllegalArgumentException? – Jerinos 2012-02-21 03:32:04

+0

@KebinKeeler你已經扔掉了!但是你抓住它並且什麼都不做。所以要麼刪除'try-catch'並在其他地方(在調用方法的地方)處理錯誤,要麼在你的catch塊中做某些事情(例如記錄並再次拋出)。這取決於你想要達到的目標。 – Vache 2012-02-21 03:47:23

+0

我無法弄清楚的問題是,如果我添加一個拋出新的IllegalArgumentException異常的catch塊並通過「星期六」它會拋出非法的月份號碼在這裏消息,而不是無效的月份名稱字符串。這是因爲當我嘗試使用Integer.parseInt()時,「星期六」出現異常。 「星期六」不會讓它進入IllegalArgumentException。我試圖說明任何不在1到12或一個月中的某一天的輸入。 – Jerinos 2012-02-21 04:15:47