異常作業
異常作業
一、 填空題
- ______異常處理______機制是一種非常有用的輔助性程式設計方法。採用這種方法可以使得在程式設計時將程式的正常流程與錯誤處理分開,有利於程式碼的編寫和維護。
- 在Java異常處理中可以使用多個catch子句,此時包含異常類的父類Exception的catch子句的位置應該是在__最後__________。
- 異常處理中finally塊可確保無論是否發生異常,該塊中程式碼總能被執行。finally塊不執行的唯一情況是在異常處理程式碼中執行__System.exit()__________語句退出Java虛擬機器。
- 異常是由Java應用程式丟擲和處理的非嚴重錯誤,比如所需檔案沒有找到、零作除數,陣列下標越界等,可分為兩類:Checked異常和____執行時異常______________。
- 在Java中對於程式可能出現的檢查時異常,要麼用try…catch語句捕獲並處理它,要麼使用____throws_______語句丟擲它,由上一級呼叫者來處理。
- Java異常處理中,如果一個方法中出現了多個Checked異常,可以在方法宣告中使用關鍵字___throws___________宣告丟擲,各異常型別之間使用逗號分隔。
二、 選擇題
1. |
以下關於異常的程式碼的執行結果是( C )。(選擇一項) |
|
|
public class Test { public static void main(String args[]) { try { System.out return; } catch(Exception e){ System.out.println("catch"); }finally { System.out.println("finally"); } } } |
|
|
|
|
|
A. |
try catch finally |
|
B. |
catch finally |
|
C. |
try finally |
|
D. |
try |
2. |
在異常處理中,如釋放資源、關閉檔案等由( C )來完成。(選擇一項) |
|
|
|
|
|
A |
try子句 |
|
B. |
catch子句 |
|
C. |
finally子句 |
|
D. |
throw子句 |
3. |
編譯並執行如下Java程式,將輸出( D )。(選擇一項) |
|
|
public static void main(String[] args) { try { int num1 = 2; int num2 = 0; int result = num1 / num2; System.out.println(result); throw new NumberFormatException( ); } catch (ArrayIndexOutOfBoundsException e) { System.out.print("1"); } catch (NumberFormatException e) { System.out.print("2"); } catch (Exception e) { System.out.print("3"); } finally { System.out.print("4"); } System.out.print("5"); } |
|
|
|
|
|
A |
134 |
|
B. |
2345 |
|
C. |
1345 |
|
D. |
345 |
4. |
閱讀如下Java程式碼,其中錯誤的行是( AC )。(選擇二項) |
|
|
public class Student { private String stuId; public void setStuId(String stuId) throw Exception { // 1 if (stuId.length() != 4) { // 2 throws new Exception("學號必須為4位!"); // 3 } else { this.stuId = stuId; //4 } } } |
|
|
|
|
|
A |
1 |
|
B. |
2 |
|
C. |
3 |
|
D. |
全部正確 |
5. |
下面選項中有關Java異常處理模型的說法錯誤的是( AD )。(選擇二項) |
|
|
|
|
|
A |
一個try塊只能有一條catch語句 |
|
B. |
一個try塊中可以不使用catch語句 |
|
C. |
catch塊不能單獨使用,必須始終與try塊在一起 |
|
D. |
finally塊可以單獨使用,不是必須與try塊在一起 |
6. |
下面選項中屬於執行時異常的是( BC )。(選擇二項) |
|
|
|
|
|
A |
Exception和SexException |
|
B. |
NullPointerException和InputMismatchException |
|
C. |
ArithmeticException和ArrayIndexOutOfBoundsException |
|
D. |
ClassNotFoundException和ClassCastException |
7. |
閱讀如下Java程式碼,在控制檯輸入"-1",執行結果是(B)。(選擇一項) |
|
|
public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("請輸入數字:"); try { int num = input.nextInt(); if (num < 1 || num > 4) { throw new Exception("必須在1-4之間!"); } } catch (InputMismatchException e) { System.out.println("InputMismatchException"); } catch (Exception e) { System.out.println(e.getMessage()); } } } |
|
|
|
|
|
A |
輸出:InputMismatchException |
|
B. |
輸出:必須在1-4之間! |
|
C. |
什麼也沒輸出 |
|
D. |
編譯錯誤 |
三、 簡答題
- Error和Exception的區別
Exception:1.可以是可被控制(checked)或者不可控制(unchecked);
2.表示一個由程式設計師導致的錯誤;
3.應該在應用程式級被處理;
Error:1.總是不可控制的(unchecked);
2.經常用來表示系統錯誤或者底層資源錯誤;
3.如果可能的話,應該在系統級被捕捉;
- Checked異常和Runtime異常的區別。
1, Checked異常是編譯異常
Runtime異常是執行異常
2,編譯異常 : 一旦 用throw 丟擲異常,如果當前方法 可處理異常,那麼直接在該方法內用try-catch 去處理。
執行異常,不需要用throws 宣告丟擲 異常物件所屬類,也可以不用throw 丟擲異常物件或異常引用
- Java異常處理中,關鍵字try、catch、finally、throw、throws分別代表什麼含義?
try 用來指定一塊預防所有“異常”的程式;
catch 子句緊跟在 try 塊後面,用來指定你想要捕捉的“異常”的型別;
throw 語句用來明確地丟擲一個“異常”(方法體);
throws 用來標明一個成員 方法可能丟擲的各種“異常”(方法宣告);
Finally 為確保一段程式碼不管發生什麼“異常”都被執行一段程式碼;
- throws和throw的區別
1:位置
throws出現在方法頭
而throw出現在方法體。
2:丟擲區別
throws表示出現異常的一種可能性,並不一定會發生這些異常;宣告的是一個異常型別
throw則是丟擲了異常,執行throw則一定丟擲了某種異常物件。
3 處理異常方式
兩者都是消極處理異常的方式(這裡的消極並不是說這種方式不好),只是丟擲或者可能丟擲異常,
但是不會由函式去處理異常,真正的處理異常由函式的上層呼叫處理。
一、 編碼題
- 編寫程式接收使用者輸入分數資訊,如果分數在0—100之間,輸出成績。如果成績不在該範圍內,丟擲異常資訊,提示分數必須在0—100之間。
要求:使用自定義異常實現
1 public class ScoreScopeException extends RuntimeException{ 2 public ScoreScopeException() { 3 super(); 4 } 5 public ScoreScopeException(String message) { 6 super(message); 7 } 8 } 9 10 import java.util.Scanner; 11 public class Test { 12 public static void main(String[] args) { 13 Scanner scanner = new Scanner(System.in); 14 try { 15 System.out.print("請輸入分數:"); 16 int score = scanner.nextInt(); 17 if (score < 0 || score > 100) { 18 throw new ScoreScopeException("分數必須在0-100之間"); 19 } 20 System.out.println("分數為:" + score); 21 } catch (ScoreScopeException e) { 22 System.out.println(e.getMessage()); 23 e.printStackTrace(); 24 } 25 } 26 }
2.寫一個方法void isTriangle(int a,int b,int c),判斷三個引數是否能構成一個三角形, 如果不能則丟擲異常IllegalArgumentException,顯示異常資訊 “a,b,c不能構成三角形”,如果可以構成則顯示三角形三個邊長,在主方法中得到命令列輸入的三個整數, 呼叫此方法,並捕獲異常。
1 public class sanjaio { 2 private static void isTriangle(int a,int b,int c) throws IllegalAccessException{ 3 if(a<0||b<0||c<0){ 4 throw new IllegalAccessException("三角形邊長不能為負數"); 5 } 6 if(a+b>c&&a+c>b&&b+c>a){ 7 System.out.println("三角形三邊分別是:"+"a="+a+" b="+b+" c="+c); 8 }else{ 9 throw new IllegalAccessException(a+","+b+","+c+","+"不能構成三角形"); 10 } 11 } 12 public static void main(String[] args) throws IllegalAccessException{ 13 Scanner sc= new Scanner(System.in); 14 System.out.println("請分別輸入三角形三條邊:"); 15 int a= sc.nextInt(); 16 int b=sc.nextInt(); 17 int c=sc.nextInt(); 18 isTriangle(a,b,c); 19 } 20 }
五、 可選題
- 編寫一個計算N個整數平均值的程式。程式應該提示使用者輸入N的值,如何必須輸入所有N個數。如果使用者輸入的值是一個負數,則應該丟擲一個異常並捕獲,提示“N必須是正數或者0”。並提示使用者再次輸入該數
1 public static void main(String[] args) { 2 Scanner sc = new Scanner(System.in); 3 System.out.println("您要輸入幾個數呢:"); 4 int n = sc.nextInt(); 5 int sum = 0; 6 for (int i = 0; i < n; i++) { 7 System.out.println("請輸入" + (i + 1) + "個數:"); 8 9 try { 10 double num1 = sc.nextDouble(); 11 if (num1 < 0) { 12 throw new Exception("輸入的數必須是正數或者是0"); 13 } 14 sum += num1; 15 } catch (Exception e) { 16 // TODO Auto-generated catch block 17 e.printStackTrace(); 18 System.out.println(e.getMessage()); 19 } 20 } 21 System.out.println("一共輸入"+n+"個數"+", 和為"+sum+", 平均值為"+sum/n); 22 } 23 }