w22116972
11/14/2015 - 2:01 PM

hw5.java

// 處理exception有兩種方式 : 1. handle 2. declare

// 1. handle : try & catch
// 用來處理你不確定會不會發生的例外或是你可以直接解決的
try { // 只要try裡發生例外,就會跑到catch去找有沒有相對應的例外
  // 在try裡面你可以1. 放入可能會發生例外的程式
  progressionArray = new long[m][n];
  // 2. 或是自己讓它發生例外拿來測試之類的
  throw new exception();
} catch (OutOfMemoryError e) { // 我們不確定m, n的值多大時會有記憶體不夠的問題
 // 通常記憶體不足也沒辦法解決所以就只需要印出錯誤訊息
 System.out.println(e.toString());
} catch (NegativeArraySizeException e) { // 如果輸入m, n可能是負數會沒辦法建陣列
  // 你可以選擇 1. 印出錯誤訊息
  System.out.println(e.toString());
  // 也可以選擇 2. 更正 
  progressionArray = new long[1][1];
}
// 這時候因為你有catch去處理例外,所以在這後面程式還會繼續執行

// 2. declare : throws
// 在方法的後面用throws 代表這個方法可能產生這個例外
public final double avg(final int r) throws ArrayIndexOutOfBoundsException {
  // 當我們確定這個if 的條件為真時必定產生例外,就可以這樣寫
  if (r < 0 || r >= super.returnArray().length) {
    throw new ArrayIndexOutOfBoundsException(); // 這時候印出的錯誤訊息其實已經是回傳toString的字串了
  }
// 把例外直接丟出不理 所以程式會在這邊就停下執行然後跳出錯誤訊息

// 以這次作業來說
// 就用第二種declare就好了
// 至於怎麼override exception裡的toString呢? 直接照著方法複寫就好,裡面再寫個switch

// 熱心同學的Q&A
// Q : 判斷錯誤的東西怎麼不是放在InvalidProgressionSizeException裡?
// A : 基本上例外類別通常是處理要回傳什麼訊息,用來判斷的東西應該是放在妳可能真正發生例外的地方
// Q : errortype是怎樣 建構子是要寫怎樣?
// A : errorType是老師自行定義的變數,用來決定例外的類型並當成在InvalidProgression的建構子參數
// A : 建構子處理傳進來的參數並且傳給toString i.e. 要怎麼在不同方法"間"且class"內"共用同一個變數

// 參考網頁 :
// http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#toString()