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