#34387: Java例外處理 (Redex正規表示式介紹)


liaoweichen1024@gmail.com (M_SQRT)

學校 : 新北市立新莊高級中學
編號 : 195452
來源 : [150.117.3.92]
最後登入時間 :
2024-11-21 20:54:31
e659. 11878 - Homework Checker -- UVA | From: [118.166.146.210] | 發表日期 : 2023-03-16 01:44

這題的許多狀況都能用例外處理解決,可以用這種寫法。

我的宣告:

以下是這題會碰上的例外:

  1. IOException
        這是使用BufferedReader就會遇到的例外,不過我們不用手動處理,直接拋出就好。

  2. NullPointerException
        處理字串的第一步我會先用split()函式拆開字串,用=字元隔開:

    由於本題是EOF結束,所以在沒有下一行輸入時,br.readLine()會回傳nullnull會讓split()發生NullPointerException錯誤,出現時就可以離開主迴圈了。

  3. NumberFormatException
        用=隔開輸入字串,固in[1]為弟弟寫的答案,可以用Integer.parseInt()轉成整數,不過此字串除了可能是數字,還有可能是?字元,除了可以用equals()來判斷,也能處理parseInt在遇到無法將字串轉成整數時所拋出的NumberFormatException錯誤。遇到這種狀況就可以continue處理下一筆輸入了。

  4. ArrayIndexOutOfBoundsException
        接著就是判斷字串中的運算子是'+'還是'-'了,一樣可以用split()分隔字串,如:

        當原in[0]中沒有字串"-"時,split()回傳的還是長度為1的字串陣列,後面的判斷提取in[1]時就會出現ArrayIndexOutOfBoundsException錯誤,接收這個錯誤後並處理字串相加運算。
    不過這個步驟用例外處理不是一個有效率的寫法,看看就好。
  5. java.util.regex.PatternSyntaxException
    當你準備使用split("+")時,會發現程式出現java.util.regex.PatternSyntaxException錯誤,不是要你catch這個錯誤,是要你避免它。split()的參數不能是單獨一個+字元,要加反斜線\+ (類似性質的還有$()*+.?[\^{|12個字元),但字面值不能只寫一個反斜線,要使用跳脫字元\\,所以最後的程式碼長的樣:

    需要這樣寫的原因是因為split()接收的參數會依照regex規則,簡介如下。

 

什麼是Regex?
中文叫正規表示式,是Regular expression的縮寫。
許多文字編輯器都支援搜尋、取代符合其格式的字串。
如同我們的字串字面值,會有特殊功能的跳脫字元,它也有一些字元是特殊用法,需要表示原字元時就要加\,以下舉幾個特殊功能的例子:

  1. |
    或。所以其實本題也可以用

    來同時隔開+-號。
  2. * + ?
    吃數量不定的字串。
    *
    是吃0~n
    +
    是吃至少1
    ?
    是最多1
  3. {}
    功能同上。
    "x{n}"  
    nx
    "x{n,}" 
    至少吃nx
    "x{n, m}" 
    [n, m]x
  4. ()
    就是括號,可以對任何字做包裝,如:

其實這樣也就不難理解為什麼單放某些字元會出現錯誤了,比如split("+"),只要被分割的字串允許,函式就會無限吃掉+前的字串,但此時+前是空字串,無限讀取空字串跟/0完全就是同一個概念啊~

希望這篇解題報告能幫助到你^_^

 
ZeroJudge Forum