程序中總有些意想不到的情況所引起的錯誤,Java中的錯誤也以對象方式呈現爲java.lang.Throwable 的各式子類實例。只要你能捕捉包裝的對象,就能夠針對該錯誤作一些處理,例如:試回覆正常流程、進行日誌記錄、以某種形式提醒用戶。html
下面的例子是求輸入數的平均數:前端
package cc.openhome; import java.util.Scanner; public class Average { public static void main(String[] args) { Scanner console = new Scanner(System.in); double sum = 0; int count = 0; while(true) { int number = console.nextInt(); if(number == 0) { break; } sum += number; count++; } System.out.printf("平均 %.2f%n", sum / count); } }
若是咱們輸入:10 20 30 0(回車)會獲得平均數20,可是若是咱們在鍵入的時候出現錯誤,若鍵入:1o 20 30 0(回車),則咱們會獲得下面的錯誤提示:java
Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:864) at java.util.Scanner.next(Scanner.java:1485) at java.util.Scanner.nextInt(Scanner.java:2117) at java.util.Scanner.nextInt(Scanner.java:2076) at cc.openhome.Average.main(Average.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) Process finished with exit code 1
所以咱們能夠try...catch來避免由於輸入錯誤形成的程序中斷,下面舉了一個例子:git
package cc.openhome; import java.util.*; public class Average2 { public static void main(String[] args) { try { Scanner console = new Scanner(System.in); double sum = 0; int count = 0; while (true) { int number = console.nextInt(); if (number == 0) { break; } sum += number; count++; } System.out.printf("平均 %.2f%n", sum / count); } catch (InputMismatchException ex) { System.out.println("必須輸入整數"); } } }
這個例子中,對於處理錯誤是採起要求從新輸入的方式,固然你也能夠採起好比略過非法輸入進行求平均值計算等方法進行異常處理。express
若是在方法設計流程中發生異常,而你設計時並無充足的信息知道該如何處理,那麼能夠拋出異常,讓條用方法的客戶端來處理。例如:設計模式
package cc.openhome; 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(); } }
上面的程序中throws FileNotFoundException(聲明方法中會拋出異常)與throw ex(執行時拋出異常)兩處關鍵語句讓try...catch處理不了異常的時候,能夠拋出由調用方法的客戶端處理,而且能夠實現先處理部分事項再拋出。數組
在多重方法調用下,異常發生點可能時在某個方法之中,若想得知發生的根源,以及多重方法調用下異常的堆棧傳播,能夠利用異常對象自動收集的堆棧追蹤來取得相關信息。多線程
查看堆棧追蹤最簡單的方法,就是直接調用異常對象printStackTrace()。例如:app
package cc.openhome; public class StackTraceDemo { 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(); } }
程序執行的某個時間點或某個狀況下,必然處於或不處於何種狀態,這是一種斷言,例如某個時間點程序某個變量值必定時多少。斷言的結果必定時成立或不成立,預期結果與實際程序狀態相同時,斷言成立,不然斷言不成立。ide
下面有兩種使用語法:
assert boolean_expression; assert boolean_expression : detail_expression;
boolean_expression 若爲true,則什麼事都不會發生,若是爲false,則會發生java.lang.AssertionError,此時若採起的是第二個語法,則會將detail_expression的結果顯示出來,若是當中是個對象,則調用toString()顯示文字描述結果。
finally能夠搭配try...catch來執行關閉資源的動做,不管try區塊中有無發生異常,若撰寫有finally區塊,則finally區塊必定會被執行。例如:
package cc.openhome; import java.io.*; import java.util.Scanner; public class FileUtil_2 { public static String readFile(String name) throws FileNotFoundException { StringBuilder text = new StringBuilder(); Scanner console = null; try { console = new Scanner(new FileInputStream(name)); while (console.hasNext()) { text.append(console.nextLine()) .append('\n'); } } finally { if(console != null) { console.close(); } } return text.toString(); } }
list是一種Collection,做用是收集對象,並以索引方式保留收集的對象順序,其操做類之一是java.lang.ArrayList。List有兩種不一樣的類ArrayList與LinkedList,在使用過程當中前者是偏向於使用數組的特性,後者則是採用了連接結構。
關於收集對象,在收集過程當中如有相同對象,則再也不重複收集,如有這類需求,可使用Set接口的操做對象。例如:
static Set tokenSet(String line) { String[] tokens = line.split(" "); return new HashSet(Arrays.asList(tokens)); }
這個只是一個程序中的片斷,一個子函數,其中就使用了HashSet收集不重複的字符串。
若是但願收集對象時以隊列方式,收集的對象加入至尾端,取得對象時從前端,則可使用Queue接口的操做對象。若是對象有操做Queue,並打算以隊列方式使用,且隊列長度受限,一般建議使用offer()、poll()與peek()等方法。
Queue方法 | Deque等義方法 |
---|---|
add() | addLast() |
offer() | offerLast() |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
若是項取得Map中全部的鍵,能夠調用Map的KeySet()返回Set對象。因爲鍵時不重複的,因此用Set操做返回時理所固然的作法,若是想取得Map中全部的值,則可使用values()返回Collection對象。
本週的教材學習中出現了不少的問題,很大一方面是概念的問題,課本中提出的新概念沒法經過閱讀課本弄清楚,而後在後面的學習中就很迷茫。直到週末快結束我尚未整理完教材學習的問題,會在新的一週前幾天儘快整理、解決並上傳。
代碼調試問題:課本中命名爲SimpleLinkedList的java文件寫入我在Idea中建立的工程之後,工程內其餘的java文件都沒法正常運行。截圖以下:
解決方案:在同窗的提示下,我將SimpleLinkedList文件最後的返回值由elem修改爲了o之後,其餘的java文件又能夠從新運行。
與20155201李卓雯同窗結對
20155201
20155208
20155314
20155303
這一週主要學習了第八章的錯誤處理,java系統內置的錯誤處理與c語言手動編譯的if判斷錯誤有很大的不一樣,體現了java語言面向對象的特色,同時也體現了java更加豐富的內置功能。此外,最近這幾周的java學習確實壓力很大,由於我並無如老師說的課後每週40個學時去學習= =,因此不少的老的內容還沒弄懂新的知識就補充進來,讓我壓力很大。不過老師上週提出的partner學習模式可能能夠給我很大的幫助,藉助同是萌新的同窗的解釋能讓我更容易去理解一些新的內容。上個星期,以前一塊兒作挑戰杯項目的同窗商量再一塊兒作接下來的大創項目,咱們的課題就是藉助java平臺開發學生生活服務平臺終端,那些同窗有java學得很是棒的,但願這個項目能對java的課程學習有所幫助。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 50/100 | 1/2 | 10/20 | |
第二週 | 150/200 | 1/2 | 20/30 | |
第三週 | 168/200 | 1/2 | 15/20 | |
第四周 | 300/500 | 1/2 | 20/20 | |
第五週 | 885/1000 | 1/2 | 30/30 |
《Java學習筆記(第8版)》學習指導
Java多線程之Runable與Thread
2016-2017-2 《Java程序設計》教學進程