##第八週課程總結&實驗報告(六) ###課程總結 本週主要講解了異常類及其處理以及java的多線程:java
1.全部的異常都是從Throwable繼承而來的,是全部異常的共同祖先。 2.Throwable有兩個子類,Error和Exception。其中Error是錯誤,對於全部的編譯時期的錯誤以及系統錯誤都是經過Error拋出的。這些錯誤表示故障發生於虛擬機自身、或者發生在虛擬機試圖執行應用時,如Java虛擬機運行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError)等。這些錯誤是不可查的,由於它們在應用程序的控制和處理能力之 外,並且絕大多數是程序運行時不容許出現的情況。對於設計合理的應用程序來講,即便確實發生了錯誤,本質上也不該該試圖去處理它所引發的異常情況。在 Java中,錯誤經過Error的子類描述。 3.Exception,是另一個很是重要的異常子類。它規定的異常是程序自己能夠處理的異常。異常和錯誤的區別是,異常是能夠被處理的,而錯誤是無法處理的。 4.Checked Exception 可檢查的異常,這是編碼時很是經常使用的,全部checked exception都是須要在代碼中處理的。它們的發生是能夠預測的,正常的一種狀況,能夠合理的處理。好比IOException,或者一些自定義的異常。除了RuntimeException及其子類之外,都是checked exception。 5.Unchecked Exception RuntimeException及其子類都是unchecked exception。好比NPE空指針異常,除數爲0的算數異常ArithmeticException等等,這種異常是運行時發生,沒法預先捕捉處理的。Error也是unchecked exception,也是沒法預先處理的。編程
代碼中的異常處理實際上是對可檢查異常的處理。 1. 經過try...catch語句塊來處理:數組
e.g.多線程
try { // 程序代碼 }catch(ExceptionName e1) { //Catch 塊 }
Catch 語句包含要捕獲異常類型的聲明。當保護代碼塊中發生一個異常時,try 後面的 catch 塊就會被檢查。 若是發生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊,這和傳遞一個參數到方法是同樣。 2. 另外,也能夠在具體位置不處理,直接拋出,經過throws/throw到上層再進行處理,具體的,若是一個方法沒有捕獲到一個檢查性異常,那麼該方法必須使用 throws 關鍵字來聲明。throws 關鍵字放在方法簽名的尾部。也可使用 throw 關鍵字拋出一個異常,不管它是新實例化的仍是剛捕獲到的。測試
finally關鍵字 finally 關鍵字用來建立在 try 代碼塊後面執行的代碼塊。 不管是否發生異常,finally 代碼塊中的代碼總會被執行。 在 finally 代碼塊中,能夠運行清理類型等收尾善後性質的語句。 finally 代碼塊出如今 catch 代碼塊最後,語法以下:this
try{ // 程序代碼 }catch(異常類型1 異常的變量名1){ // 程序代碼 }catch(異常類型2 異常的變量名2){ // 程序代碼 }finally{ // 程序代碼 }
2.多線程 進程和線程的區別編碼
線程不能看作獨立應用,而進程能夠 進程有獨立的地址空間,相互不影響,線程只是進程的不一樣執行路徑 線程沒有獨立的地址空間,多進程的程序比多線程的程序健壯 進程的切換比線程的切換開銷大 Java對操做系統提供的功能進行封裝,包括進程和線程 運行一個程序會產生一個進程,進程至少包含一個線程 每一個進程對應一個JVM實例,多個線程共享JVM裏的堆 Java採用單線程編程模型,程序會自動建立主線程 主線程能夠建立子線程,原則上要後於子線程完成執行操作系統
start和run方法的區別線程
調用start方法會建立一個新的子線程並啓動 run方法只是Thread的一個普通方法的調用設計
多線程的實現有兩種方法:繼承Thread類和使用Runnable接口 Thread類不共享資源,Runnable接口可共享資源。
class 類名稱 extends Thread{ 屬性...; 方法...; public void run(){ 線程主體; } }
###實驗報告 ####實驗六 Java異常 實驗目的 理解異常的基本概念; 掌握異常處理方法及熟悉常見異常的捕獲方法。 實驗要求 練習捕獲異常、聲明異常、拋出異常的方法、熟悉try和catch子句的使用。 掌握自定義異常類的方法。
實驗內容 編寫一個類,在其main()方法中建立一個一維數組,在try字句中訪問數組元素,使其產生ArrayIndexOutOfBoundsException異常。在catch子句裏捕獲此異常對象,而且打印「數組越界」信息,加一個finally子句,打印一條信息以證實這裏確實獲得了執行。 自定義異常類的使用 車站檢查危險品的設備,若是發現危險品會發出警告。編程模擬設備發現危險品。 技術方案: 編寫一個Exgeption的子類DangerException,該子類能夠建立異常對象,該異常對象調用toShow()方法輸出「危險物品」。編寫一個Machine類,該類的方法checkBag(Goods goods)當發現參數goods是危險品時(goods的isDanger屬性是true)將拋出DangerException異常。 程序在主類的main()方法中的try-catch語句的try部分讓Machine類的實例調用checkBag(Goods goods)的方法,若是發現危險品就在try-catch語句的catch部分處理危險品。 源代碼 ··· package test;
public class test2 {
public static void main(String[] args) { int a[]= {5,6,8,9,10}; try { for(int i=0;i<5;i++) { System.out.println(a[i]); } }catch(Exception e) { e.getStackTrace(); System.out.println("數字越界"); }finally { System.out.println("一直輸出"); } }
}
··· 實驗截圖:
/這道題目審題的時候不當心漏掉了,剛剛問了下室友才發現/ 源代碼: Maechine機械類
package test; import java.util.ArrayList; public class Maechine { private String name; Goods goods; public boolean isDanger(String name) { ArrayList<String> list0 = new ArrayList<String>() { { add("汽油"); add("槍"); add("酒精"); add("刀具"); } }; boolean flag=false; int size =list0.size(); for(int i=0;i<size;i++) { if(name.equals(list0.get(i))) { flag = true; break; } } return flag; } public void checkBag(Goods goods) throws DangerException { name=goods.getName(); if(isDanger(name)) { throw new DangerException(goods.getName()); } else { System.out.println(goods.getName()); System.out.println(goods.getName()+"不是危險品"); } } }
商品類Goods
package test; public class Goods { private String name; public Goods(String name) { this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
異常類DangerException
package test; public class DangerException extends Exception { private String info; public DangerException(String info) { this.info=info; } public void toShow() { System.out.println(info); } }
測試類test
package test; import java.util.ArrayList; import java.util.Scanner; public class test { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>() { { add("汽油"); add("槍"); add("麪包"); add("酒精"); add("刀具"); add("水果"); } }; Scanner scan=new Scanner(System.in); int i=scan.nextInt(); String name = list.get(i); Goods good = new Goods(name); try { Maechine mc = new Maechine(); mc.checkBag(good); } catch (DangerException e) { e.toShow(); System.out.println(good.getName() + "是危險品"); } } }
實驗截圖: