201621123037 《Java程序设计》第10周学习总结
作業10-異常
標簽(空格分隔): Java
1. 本周學習總結
1.1 以你喜歡的方式(思維導圖或其他)歸納總結異常相關內容。
2. 書面作業
本次PTA作業題集異常
1. 常用異常
結合題集題目7-1回答
1.1 自己以前編寫的代碼中經常出現什么異常、需要捕獲嗎(為什么)?應如何避免?
答:
常出現異常:
比如不合理調用時,容易產生空指針,蹦NullPointerException錯誤;
當輸入的類型和定義的類型有出入時,蹦NumberFormatException錯誤;
當對于一個類型進行強制轉換時,有時會蹦ClassCastException錯誤;
對于數組,最常見的便是數組的越界問題。
這些異常屬于Unchecked Exception,此類異常不需要捕獲,只有checked Exception才一定需要捕獲。
避免:
對于上述的那些空指針可以提前的進行判斷是否為Null,數組越界也可以加判斷語句進行防止,
不過之后可以用try-catch語句來捕獲異常增強代碼的穩定性。
1.2 什么樣的異常要求用戶一定要使用捕獲處理?
答:
除了Error、RuntimeException及其子類 以外的異常都是Checked Exception,此類異常需要捕獲。
當Checked Exception拋出異常之后需要用try-catch塊來捕獲并處理該異常,或者對于一些方法,在其之后添加上
throws關鍵字,來提示可能拋出異常,再針對拋出的異常進行處理。
2. 處理異常使你的程序更加健壯
題集題目7-2
2.1 實驗總結。并回答:怎么樣才能讓你的程序更加健壯?
答:
try {String x = sc.next();list[i]=Integer.parseInt(x); }catch(Exception e) {System.out.println(e);i--; }這道題對于非整型字符串,拋出異常信息,用catch捕獲之后,輸出異常的信息便可。需要注意的地方是,由于要填滿整個數組,異常輸入值被空過時,“i--”來完成題目要求。
3. throw與throws
題集題目7-3
閱讀Integer.parsetInt源代碼
3.1 Integer.parsetInt一開始就有大量的拋出異常的代碼,這種做法有什么好處?
源代碼: public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10); } //將字符串參數作為帶符號十進制整數來分析。除過第一個字符為 ASCII 字符中減號 '-' 表示的負數,字符串中的字符都必須是十進制數。 源代碼: 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_VALUEdigit = 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; }源代碼里拋出NumberFormatException異常,拋出異常的判斷主要是:
s為Null、radix進制小于2、radix進制大于36、第一個字符既不是“-”也不是“+”等異常。
在實驗題中ArrayUtils類中的判斷也仿照以上源代碼進行throw,并附帶上異常的原因,給調用者提供信息。
3.2 結合自己編寫的程序與3.1,分析自己編寫的方法拋出異常時一般需要傳遞給調用者一些什么信息?
答:
拋出IllegalArgumentException異常的同時也傳遞出異常的原因,如圖中表明出的,begin/end到底是越界的問題還是相對大小關系的錯誤問題。
4. 用異常改進ArrayIntegerStack
題集題目6-3
4.1 結合6-3代碼,回答使用拋出異常的方式代表程序運行時出錯有什么好處?比單純的返回錯誤值,有何優點?
答:
使用拋出異常的方式代表運行的出錯,不僅可以報錯誤類型,還可以具體實現到拋出錯誤原因,給使用者更大的便利。除此之外,如果按照以前C語言自己設置返回值,將正確時返回結果,錯誤時返回-1的話,這樣不嚴謹。因為當返回結果為-1時,程序的代碼會將其按照錯誤代碼來判斷,整個代碼的嚴謹性會大打折扣。
4.2 如果一個方法內部的內碼拋出的是RuntimeException類型的異常,那么方法聲明是否應該使用throws關鍵字,如果使用throws關鍵字聲明該方法拋出的異常,能給我們帶來什么好處嗎?
答:
可以不使用throws關鍵字,用throws關鍵字拋出異常優點:
當一個異常不想在方法中用try-catch進行處理時,可以將異常拋給別的類或方法來處理,此時就用到了throws。并且throw和throws就該是成對出現的(除了RuntimeException,RuntimeException可以不用Throws聲明異常拋出)。
5. 函數題-多種異常的捕獲
題集題目6-1
5.1 結合6-1代碼,回答:一個try塊中如果可能拋出多種異常,且異常之間可能有繼承關系,捕獲時需要注意些什么?
答:
就如6-1這道題,里面有多個錯誤,則在捕獲時就需要注意是否存在繼承的關系。
父類的異常處理一定要放在子類的后面,否則父類異常的處理就會搶在子類前進行捕獲。如題中RuntimeException 是Exception的子類,如果Exception放在子類的前面,則優先被父類捕獲。
5.2 一個try塊中如果可能拋出多種異常,使用Java8的多重異常捕獲語法需要注意些什么?
答:
在java8 中 異常捕獲的try-catch可以自動關閉在try表達式中打開的對象,無需開發者手動關閉。
如下圖:
不在需要:
6. 為如下代碼加上異常處理
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));//打印數組內容6.1 改正代碼,并增加如下功能。當找不到文件時,需提示用戶找不到文件xxx,請重新輸入文件名,然后嘗試重新打開。 如果是其他異常則提示打開或讀取文件失敗!。
注1:里面有多個方法均可能拋出異常。
功能2:需要添加finally關閉文件。無論上面的代碼是否產生異常,總要提示關閉文件ing。如果關閉文件失敗,提示關閉文件失敗!
答:
如上異常之一,更改如下即可解除報錯:
- 需要拋出FileNotFoundException異常,故要加上throws FileNotFoundException。
- 又available()方法和read()方法都需要拋出IOException異常,故也需要加上throws IOException。
- FileNotFoundException是IOException的子類,所以只需要加上throws IOException即可解決。
按要求更改后代碼:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.Scanner;public class boke5_1 {public static void main(String[] args) throws IOException {byte[] content = null;Scanner sc = new Scanner(System.in);FileInputStream fis =null;String str = sc.next();while(true) {try {fis = new FileInputStream(str);// fis = new FileInputStream("D\testfis.txt");int bytesAvailabe = fis.available();//獲得該文件可用的字節數if(bytesAvailabe>0){content = new byte[bytesAvailabe];//創建可容納文件大小的數組fis.read(content);//將文件內容讀入數組}System.out.println(Arrays.toString(content));//打印數組內容}catch(FileNotFoundException e) {System.out.println("找不到testfis.txt文件,請重新輸入文件名");str = sc.next();}catch(IOException e) {System.out.println("打開或讀取文件失敗!");System.exit(0);}finally {fis.close();}}} }運行結果:
6.2 結合題集6-2代碼,要將什么樣操作放在finally塊?為什么?使用finally關閉資源需要注意一些什么?
答:
6-2的代碼,將close()釋放資源方法放到了finally塊中。
因為finally起到維護對象的內部狀態,并可以清理非內存資源的作用。特別是在關閉數據庫連接這方面,如果把數據庫連接的close()方法放到finally中,就會大大降低程序出錯的幾率。并且finally也起到一個最佳補充的作用。
使用finally關閉資源需要注意:
- finally塊的陷阱
注意:
"關閉資源"不會輸出,因為try塊中的System.exit(0);將當前線程停止了,而finally塊不能執行已經停止的線程.
- finally塊和方法返回值
注意:
當在try塊中既有return 語句也有finlly的時候,系統不會立馬執行try塊中的return ,而是執行finally中的程序。
若finally塊中也有return 語句,則執行finally中的reutrn語句,然后程序結束,不會執行try塊中的return
注意:
若finally塊中有 return語句,則程序不會真正拋出異常,而是直接執行完finally塊后,返回return語句。
6.3 使用Java7中的try-with-resources來改寫上述代碼實現自動關閉資源。簡述這種方法有何好處?
答:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.Scanner;public class boke5_1 {public static void main(String[] args) throws IOException {byte[] content = null;Scanner sc = new Scanner(System.in);String str = sc.next();while(true) {try(FileInputStream fis = new FileInputStream(str)) {int bytesAvailabe = fis.available();//獲得該文件可用的字節數if(bytesAvailabe>0){content = new byte[bytesAvailabe];//創建可容納文件大小的數組fis.read(content);//將文件內容讀入數組}System.out.println(Arrays.toString(content));//打印數組內容}catch(FileNotFoundException e) {System.out.println("找不到testfis.txt文件,請重新輸入文件名");str = sc.next();}catch(IOException e) {System.out.println("打開或讀取文件失敗!");System.exit(0);}} } }運行結果(同上):
好處:
- 少了finally塊,使代碼精簡化了。
- 不用編寫finally塊,系統自動關閉可以使開發人員在編寫時,不再用考慮資源關閉這方面,省去了開發中可能出現的代碼風險。
7. 面向對象設計作業-圖書館管理系統(分組完成,每組不超過3個同學)
登錄lib.jmu.edu.cn,對圖書進行搜索。然后登錄圖書館信息系統,查看我的圖書館。如果讓你實現一個圖書借閱系統,嘗試使用面向對象建模。
7.1 該系統的使用者有誰?
答:
使用者包括 學生/老師、管理員
7.2 主要功能模塊(不要太多)及每個模塊的負責人。下周每個人要提交自己負責的模塊代碼及運行視頻。
學生、老師:
- 登陸
- 注冊
- 查找書籍
- 借閱書籍
- 歸還書籍
- 查詢當前借閱信息
- 掛失
管理員:
- 登陸
- 增加新書籍
- 下架舊書籍
- 修改圖書信息
- 查詢書籍去向
- 查詢庫中預留書籍
7.3 該系統的主要的類設計及類圖(可用)
- 主要設計:
用戶類[Users]:存放用戶信息
屬性
private String Name //用戶名 private String Account //賬號 private String Password //密碼 static ArrayList<User> user = new ArrayList() //用于存儲每個用戶的信息方法
BorrowBook //借閱書籍 SearchBook //查找書籍 ReturnBook //歸還書籍 Show //查詢當前借閱信息管理員類[Manager]:管理員管理
屬性
private String Name //用戶名 private String Account //賬號 private String Password //密碼 static ArrayList<User> Manager = new ArrayList() //用于存儲每個用戶的信息方法
AddBook //增加新書籍 DelBook //下架舊書籍 FindInformation //查詢書籍去向 ChangeInformation //修改圖書信息 remainBook //查詢庫中預留書籍圖書類[Book]
屬性
private String Name //書名 private String AuthorName //作者 private int num //數量 static ArrayList<User> books = new ArrayList() //用于存儲書籍條目- 類圖:
7.4 你準備如何存儲圖書信息、解決信息、讀者信息等。
答:
在用戶進行操作期間,使用動態數組進行存儲圖書信息等問題,當系統退出時,全部信息寫入文件中。大概這么設想的,具體后續團隊編寫再按需更改。
8. 選做:使用異常改進你的購物車系統
舉1個例子說明你是如何使用異常處理機制讓你的程序變得更健壯。
說明要包含2個部分:1. 問題說明(哪里會碰到異常)。2.解決方案(關鍵代碼)
答:
- 栗子1號:
在菜單欄中輸入序號時會產生錯誤:
之前利用循環進行反復輸入,直到輸入正確才讀入:
現在改用異常類優化后的關鍵代碼:
try {x=sc.nextInt();if(x<0|x>1)throw new InputMismatchException("plese input agian:(input在0-1之間)"); elsebreak;}catch(InputMismatchException e){ System.out.println(e);x=sc.nextInt();}運行效果:
- 栗子2號:
將購物車系統 的商品信息寫入文件中再讀出,在讀文件時可能會出現讀入的文件為空的異常,并且關閉文件時也會出現IOException
關鍵代碼:
try {fils= new FileInputStream(name);ObjectInputStream objIn=new ObjectInputStream(fils);temp=(Object[]) objIn.readObject();objIn.close();} catch (IOException e) {System.out.println("read object failed");} catch (ClassNotFoundException e) {System.out.println(e);}finally{if(fils!=null){try {fils.close();} catch (IOException e) {System.out.println(e);}}}3.碼云及PTA
題目集:異常
3.1. 碼云代碼提交記錄
在碼云的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然后搜索并截圖
3.2 截圖PTA題集完成情況圖
需要有兩張圖(1. 排名圖。2.PTA提交列表圖)
3.3 統計本周完成的代碼量
需要將每周的代碼統計情況融合到一張表中。
| 1 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 |
| 5 | 1167 | 1167 | 26 | 26 |
| 6 | 1830 | 663 | 32 | 6 |
| 7 | 2282 | 452 | 45 | 13 |
| 8 | 2446 | 164 | 48 | 3 |
| 9 | 2774 | 328 | 56 | 8 |
| 10 | 3313 | 539 | 65 | 9 |
| 11 | 3726 | 413 | 75 | 10 |
轉載于:https://www.cnblogs.com/qin-yu/p/7881854.html
總結
以上是生活随笔為你收集整理的201621123037 《Java程序设计》第10周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Bash变量-数值运算与运算
- 下一篇: CodeForces 699C - Va