1. 程式人生 > 實用技巧 >異常&執行緒習題答案

異常&執行緒習題答案

基礎題

練習一:異常的體系

問題:

請描述異常的繼承體系

請描述你對錯誤(Error)的理解

請描述你對異常(Expection的理解)

請描述你對執行時異常(RuntimeException)的理解

答:

異常繼承體系為:異常的根類是 java.lang.Throwable,其下有兩個子類:

java.lang.Error 與 java.util.Exception 。而Exception又分為編譯時期異常:checked異常,與執行時期異常:runtime異常。

Error:表示不可修復的惡性的錯誤,只能通過修改程式碼規避錯誤的產生,通常是系統級別的,所以很嚴重。

Exception:表示可修復的良性(相對於錯誤)的異常,異常產生後程序員可以並且應該通過程式碼的方式糾正,使程式繼續執行,是必須要處理的。

執行時期異常:runtime異常。在執行時期,檢查異常.在編譯時期,執行異常不會編譯器檢測(不報錯)。

練習二:throwthrows的區別

問題:

請描述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);
    }
}


 }
}