異常&執行緒習題答案
基礎題
練習一:異常的體系
問題:
請描述異常的繼承體系
請描述你對錯誤(Error)的理解
請描述你對異常(Expection的理解)
請描述你對執行時異常(RuntimeException)的理解
答:
異常繼承體系為:異常的根類是 java.lang.Throwable,其下有兩個子類:
java.lang.Error 與 java.util.Exception 。而Exception又分為編譯時期異常:checked異常,與執行時期異常:runtime異常。
Error:表示不可修復的惡性的錯誤,只能通過修改程式碼規避錯誤的產生,通常是系統級別的,所以很嚴重。
Exception:表示可修復的良性(相對於錯誤)的異常,異常產生後程序員可以並且應該通過程式碼的方式糾正,使程式繼續執行,是必須要處理的。
執行時期異常:runtime異常。在執行時期,檢查異常.在編譯時期,執行異常不會編譯器檢測(不報錯)。
練習二:throw與throws的區別
問題:
請描述throw的使用位置,作用是什麼?
請描述throws的使用位置,作用是什麼?
答:
throw關鍵字通常用在方法體中,並且丟擲一個異常物件。程式在執行到throw語句時立即停止,它後面的語句都不執行。
throws關鍵字通常被應用在宣告方法時,用來指定可能丟擲的異常。多個異常可以使用逗號隔開。當在主函式中呼叫該方法時,如果發生異常,就會將異常物件拋給方法呼叫處。
練習三:異常的處理方式
問題:
1. 異常處理方式有幾種,分別是什麼?
2. 詳細闡述每種方式對異常是如何處理的
答:
異常的處理方式有兩種,分別是使用throws和try...catch...finally
throws用在方法的宣告上後接異常類名,是把異常拋給呼叫者進行處理
try...catch...finally是捕獲異常,自己處理,處理完畢後面的程式可以繼續執行
try程式碼塊中是可能出現異常的程式碼
catch程式碼塊,是遇到異常,對異常進行處理的程式碼
finally程式碼塊是無論是否發生異常,都必須執行的程式碼,用於釋放資源.
練習四:常見異常,及產生原因
問題:請列舉常見異常,並說明產生原因。
答:
NullPointerException:
當應用試圖在要求使用物件的地方使用了null時,丟擲該異常。譬如:呼叫null物件的例項方法、訪問null物件的屬性、計算null物件的長度等等。
ArrayIndexOutOfBoundsException:陣列索引越界異常。
當對陣列的索引值為負數或大於等於陣列大小時丟擲此異常。
ArithmeticException:算術運算異常。
程式中出現了除以零這樣的運算就會出這樣的異常,對這種異常,大家就要好好檢查一下自己程式中涉及到數學運算的地方,公式是不是有不妥了。
NumberFormatException:數字格式異常。
當試圖將一個String轉換為指定的數字型別,而該字串確不滿足數字型別要求的格式時,丟擲該異常。
注意:答案不唯一,合理即可。
練習五:看程式碼,分析結果
問題:根據給出的相應程式碼,分析可能產生的結果。
1.舉例:
public static void main(String[]args){
String str=null;
System.out.println(str.length());
}
答:變數str的值為null,呼叫方法時,報空指標異常NullPointerException
2.舉例:
public static void main(String[]args){
int arr[]={1,2};
System.out.println(arr[2]);
}
答:索引值2大於等於陣列arr的長度時,報陣列索引越界異常ArrayIndexOutOfBoundsException
3.舉例:
public static void main(String[]args){
System.out.println(1/0);
}
答:整數0做了分母,報算術運算異常ArithmeticException:/by zero
4.舉例:
public static void main(String[]args){
System.out.println(Integer.parseInt("itcast"));
}
答:
把字串“itcast”轉換為Integer型別時,當然會報數字格式化異常啦NumberFormatException
5.舉例:
public static void main(String[] args) { SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd"); try { Date date = format.parse("2018-04-03"); System.out.println("程式正常"); } catch (ParseException e) { System.out.println("程式異常"); } }
答:
列印結果“程式正常”.try程式碼塊中並沒有產生異常,catch程式碼塊中的程式碼不會執行。date為2018年1月3日00點04分00秒。
練習六:並行、併發概念
問題:請簡單描述什麼是並行,什麼是併發?
答:
並行:指兩個或多個事件在同一時刻發生(同時發生)。
併發:指兩個或多個事件在同一個時間段內發生。
通俗易懂版:
你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。
你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支援併發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援並行。
併發的關鍵是你有處理多個任務的能力,不一定要同時。
並行的關鍵是你有同時處理多個任務的能力。
所以它們最關鍵的點就是:是否是『同時』。
練習七:程序概念、執行緒概念、執行緒與程序聯絡
問題:請描述什麼是程序,什麼是執行緒,程序與執行緒之間的關係,並舉例說明。
答:
程序指正在執行的程式。確切的來說,當一個程式進入記憶體執行,即變成一個程序,程序是處於執行過程中的程式,並且具有一定獨立功能。
執行緒是程序中的一個執行單元,負責當前程序中程式的執行,一個程序中至少有一個執行緒。一個程序中是可以有多個執行緒的,這個應用程式也可以稱之為多執行緒程式。
一個程式執行後至少有一個程序,一個程序中可以包含多個執行緒,但一個程序中至少包含一個執行緒。比如使用迅雷軟體下載網路檔案時,同時下載多個檔案,就使用到了多執行緒下載。
練習八:自定義異常類
問題:
請使用程式碼實現
每一個學生(Student)都有學號,姓名和分數,分數永遠不能為負數
如果老師給學生賦值一個負數,丟擲一個自定異常
答:
/*
1.定義異常類NoScoreException,繼承RuntimeException
a)提供空參和有參構造方法
*/
public class NoScoreException extends RuntimeException { // 空參構造 public NoScoreException() { super(); } // 有參構造 public NoScoreException(String message) { super(message); } }
public class Student { private String name; private int score; // 空參構造 public Student() { super(); } // c)提供有參構造; // i.使用setXxx方法給名稱和score賦值 public Student(String name,int score){ setName(name); setScore(score); } // d)提供setter和getter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } // i.在setScore(int score)方法中 public void setScore(int score) { // 1.首先判斷,如果score為負數,就丟擲NoScoreException,異常資訊為:分數不能為負數:xxx. if(score <0){ throw new NoScoreException(":分數不能為負數:"+score); } // 2.然後在給成員score賦值. this.score = score; } }
/*
2.定義學生類(Student)
a)屬性:name,score
b)提供空參構造
c)提供有參構造;
i.使用setXxx方法給名稱和score賦值
d)提供setter和getter方法
i.在setScore(int score)方法中
1.首先判斷,如果score為負數,就丟擲NoScoreException,異常資訊為:分數不能為負數:xxx.
2.然後在給成員score賦值.
*/
/*
3.定義測試類Test9
a)提供main方法,在main方法中
i.使用滿參構造方法建立Student物件,分數傳入一個負數,執行程式
ii.由於一旦遇到異常,後面的程式碼的將不在執行,所以需要註釋掉上面的程式碼
iii.使用空參構造建立Student物件
iv.呼叫setScore(int score)方法,傳入一個正數,執行程式
v.呼叫setScore(int score)方法,傳入一個負數,執行程式
*/
public class Test9 { public static void main(String[] args) { // i.使用滿參構造方法建立Student物件,分數傳入一個負數,執行程式 // Student s = new Student("景甜", -10); // ii.由於一旦遇到異常,後面的程式碼的將不在執行,所以需要註釋掉上面的程式碼 // iii.使用空參構造建立Student物件 Student s = new Student(); // iv.呼叫setScore(int score)方法,傳入一個正數,執行程式 s.setScore(100); // v.呼叫setScore(int score)方法,傳入一個負數,執行程式 s.setScore(-5); } }
問題:練習九:多執行緒
建立多執行緒物件,開啟多執行緒。在子執行緒中輸出1-100之間的偶數,主執行緒輸出1-100之間的奇數。
答:
自定義執行緒類:
public class MyThread extends Thread { /** * 重寫run方法,完成該執行緒執行的邏輯 */ @Override public void run() { for (int i = 1; i <= 100; i++) { if (i % 2 == 0) { System.out.println("子執行緒列印輸出偶數:" + i); } } } }
測試類:
public class Test11 { public static void main(String[] args) { //建立自定義執行緒物件 MyThread mt = new MyThread(); //開啟執行緒 mt.start(); //在主方法中執行for迴圈 for (int i = 1; i <= 100; i++) { if (i % 2 == 1) { System.out.println("主執行緒列印輸出奇數:" + i); } } } }