1. 本週學習總結
1.1 以你喜歡的方式(思維導圖或其他)歸納總結集合與泛型相關內容。
2. 書面作業
本次作業題集異常
1.常用異常
題目5-1
1.1 截圖你的提交結果(出現學號)
1.2 自己以前編寫的程式碼中經常出現什麼異常、需要捕獲嗎(為什麼)?應如何避免?
太久的記不起了,那就拿上週的舉個例子,比如在退棧的時候如果棧為null就會出現NullPointerException
從圖片可以看到NullPointerException直接繼承自RuntimeException,所以不用捕獲
在退棧的時候要判斷一下
!stack.empty()
,這樣就能避免丟擲異常。
1.3 什麼樣的異常要求使用者一定要使用捕獲處理?
除了Error與RuntimeException及其子類以外的異常都是Checked Exception,都需要捕獲處理。
2.處理異常使你的程式更加健壯
題目5-2
2.1 截圖你的提交結果(出現學號)
2.2 實驗總結
本題出現了一次答案錯誤,開始我用
int n=sc.nextInt()
輸入陣列的大小,而後用sc.nextLine()
輸入陣列的內容這樣就會出現
從圖片上看多輸入了一個空字元,這是因為在輸入n後敲擊回車,那麼這個回車還沒被消化掉,那麼會被next.Line讀入這樣就會導致結果錯誤,那麼在讀入陣列內容的時候用sc.next()
就能解決。
3.throw與throws
題目5-3
3.1 截圖你的提交結果(出現學號)
3.2 閱讀Integer.parsetInt原始碼,結合3.1說說丟擲異常時需要傳遞給呼叫者一些什麼資訊?
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
public static int parseInt(String s, int radix)
throws NumberFormatException
{
/*
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/
if (s == null) {
throw new NumberFormatException("null");
}
if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
}
if (radix > Character.MAX_RADIX) {
throw new NumberFormatException("radix " + radix +
" greater than Character.MAX_RADIX");
}
int result = 0;
boolean negative = false;
int i = 0, len = s.length();
int limit = -Integer.MAX_VALUE;
int multmin;
int digit;
if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') { // Possible leading "+" or "-"
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else if (firstChar != '+')
throw NumberFormatException.forInputString(s);
if (len == 1) // Cannot have lone "+" or "-"
throw NumberFormatException.forInputString(s);
i++;
}
multmin = limit / radix;
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw NumberFormatException.forInputString(s);
}
if (result < multmin) {
throw NumberFormatException.forInputString(s);
}
result *= radix;
if (result < limit + digit) {
throw NumberFormatException.forInputString(s);
}
result -= digit;
}
} else {
throw NumberFormatException.forInputString(s);
}
return negative ? result : -result;
}
顯示是哪一種異常,和出現異常的原因。
其次可能就是一些定位啊,讓呼叫者能更快的鎖定異常的地方。
4.函式題
題目4-1(多種異常的捕獲)
4.1 截圖你的提交結果(出現學號)
4.2 一個try塊中如果可能丟擲多種異常,捕獲時需要注意些什麼?
子類異常必須放在父類異常前面。
5.為如下程式碼加上異常處理
byte[] content = null;
FileInputStream fis = new FileInputStream("testfis.txt");
int bytesAvailabe = fis.available();//獲得該檔案可用的位元組數
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//建立可容納檔案大小的陣列
fis.read(content);//將檔案內容讀入陣列
}
System.out.println(Arrays.toString(content));//列印陣列內容
5.1 改正程式碼,讓其可正常執行。注1:裡面有多個方法均可能丟擲異常。注2:要使用finally關閉資源。
byte[] content = null;
FileInputStream fis = null;
int bytesAvailabe = 0;
try {
fis = new FileInputStream("testfis.txt");
bytesAvailabe = fis.available();//獲得該檔案可用的位元組數
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//建立可容納檔案大小的陣列
fis.read(content);//將檔案內容讀入陣列
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
} finally{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(Arrays.toString(content));//列印陣列內容
}
}
使用了try-cathch捕獲異常輸出。
5.2 使用Java7中的try-with-resources來改寫上述程式碼實現自動關閉資源.
try (FileInputStream fis = new FileInputStream("testfis.txt")){
bytesAvailabe = fis.available();//獲得該檔案可用的位元組數
if(bytesAvailabe>0){
content = new byte[bytesAvailabe];//建立可容納檔案大小的陣列
fis.read(content);//將檔案內容讀入陣列
}
}
改動處:將嘗試自動關閉資源的物件生成寫在try之後的圓括號中。
6.重點考核:使用異常改進你的購物車系統(未提交,得分不超過6分)
舉至少兩個例子說明你是如何使用異常處理機制讓你的程式變得更健壯。
說明要包含2個部分:1. 問題說明(哪裡會碰到異常)。2.解決方案(關鍵程式碼)
問題說明:如圖我們可以看到,選單要求輸入整型但是輸入為字元或者其他非整型就會出現錯誤
解決方案:
int x;
try{
x=Menu.showmenu();
}catch(InputMismatchException e){
System.out.println("請正確輸入");
x=Menu.showmenu();
}
修改後
問題說明:當輸入5時超過了儲存書籍陣列的大小,這是就會顯示陣列越界。
解決方案:
if(m>=5){
System.out.println("請正確輸入");
m = in.nextInt();
}
修改後:
7.選做:JavaFX入門
如果未完成作業1、2的先完成1、2。貼圖展示。如果已完成作業1、2的請完成作業3。內有程式碼,可在其上進行適當的改造。建議按照裡面的教程,從頭到尾自己搭建
8.選做:課外練習
JavaTutorial中Questions and Exercises
3. 使用碼雲管理Java程式碼
4.課外閱讀 (選做)
任選下面一篇文章閱讀,列舉出幾點自己能理解的異常處理最佳實踐。
Best Practices for Exception Handling
Exception-Handling Antipatterns Blog
The exceptions debate