本週主要進行第八章和第九章的學習。html
java中全部的錯誤都會打包爲對象,能夠try catch表明錯誤的對象後作一些處理。運用try、catch,還能夠在捕捉處理錯誤以後,嘗試恢復程序正常執行流程。java
import java.util.*; public class AVE { public static void main(String[] args) { Scanner console =new Scanner (System.in); double sum=0; int count =0; while(true) { try{ int number=console.nextInt(); if(number==0) { break; } sum+=number; count++; }catch (InputMismatchException ex){ System.out.printf("略過非整數輸入:%s%n",console.next()); } } System.out.printf("AVE %.2f%n",sum/count); } }
程序運行結果:app
若是父類異常對象在子類異常前被捕捉,則catch子類異常對象的區塊將永遠不會被執行。誤會被包裝爲對象,這些對象是可拋出的,所以設計錯誤對象都繼承自java.lang.Throwable類。dom
在異常發生時,可以使用try 、catch處理當時可進行的異常處理,在catch區塊進行完部分錯誤處理以後,可使用throw(注意不是throws)將異常再拋出。學習
import java.io.*; import java.util.Scanner; public class FileUtil { public static String readFile(String name) throws FileNotFoundException{ StringBuilder text = new StringBuilder(); try{ Scanner console = new Scanner (new FileInputStream(name)); while(console.hasNext()){ text.append(console.nextLine()) .append('\n'); } }catch(FileNotFoundException ex){ ex.printStackTrace(); throw ex; } return text.toString(); } }
只有java是採用受檢異常的語言。ui
若收集的對象常常會有變更索引的狀況,也許考慮連接方式操做的List會比較好,像是隨時會有客戶端登陸或註銷的客戶端List,使用LinkedList會有比較好的效率。設計
在收集過程當中如有相同對象,則再也不重複收集,若是有這類需求,可使用Set接口的操做對象。code
public class StackTraceDemo1 { public static void main(String[] args) { try { c(); } catch (NullPointerException ex) { ex.printStackTrace(); } } static void c() { b(); } static void b() { a(); } static String a() { String text = null; return text.toUpperCase(); } }
查看堆棧追蹤最簡單的方法,就是直接調用異常對象的 printStackTrace()。htm
在使用 throw 重拋異常時,異常的追蹤堆棧起點,還是異常的發生根源,而不是重拋異常的地方,對象
public class StackTraceDemo2 { public static void main(String[] args) { try{ c(); }catch(NullPointerException ex){ ex.printStackTrace(); } } static void c(){ try{ b(); }catch(NullPointerException ex) { ex.printStackTrace(); throw ex; } } static void b(){ a(); } static String a(){ String text = null; return text.toUpperCase(); } }
不管try區塊中有無異常,若撰寫finally區塊,則finally區塊必定會被執行
public class FinallyDemo { public static void main(String[] args) { System.out.println(test(true)); } static int test(boolean flag){ try{ if(flag){ return 1; } }finally{ System.out.println("finally..."); } }return 0; }
收集對象的共同行爲定義在Collection中。
java.util.ArrayDeque操做了Deque接口,可使用ArrayDeque來操做容量有限的堆棧。
若是對象有操做Queue,並打算以隊列方式使用,且隊列長度受限,一般建議使用offer()、poll()與peek()等方法。
import java.util.*; interface Request{ void execute(); } public class RequestQueue { public static void main(String[] args) { Queue requests = new LinkedList(); offerRequestTo(requests); process(requests); } static void offerRequestTo(Queue requests){ for(int i=1;i<6;i++){ Request request = new Request(){ public void execute(){ System.out.printf("處理數據%f%n",Math.random()); } }; requests.offer(request); } } static void process(Queue requests){ while(requests.peek()!=null){ Request rquest = (Request) request.poll(); request.execute(); } } }
學習的東西愈來愈難了,光敲代碼是沒有用的,仍是要多思考,多練習,不然會學得很不紮實,好比上週考試的操做題就不會。因此之後還須要在java上投入更多的時間練習。
代碼託管截圖:
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 100/100 | 2/2 | 10/10 | 初步認識java |
第二週 | 150/250 | 1/3 | 12/22 | 掌握Java基礎語法 |
第三週 | 537/787 | 2/4 | 20/42 | 認識對象,對象封裝 |
第四周 | 500/1287 | 1/5 | 20/62 | 繼承與多態,接口與多態 |
第五週 | 300/1587 | 1/6 | 20/82 |