例外處理 例外的基本觀念 多重例外處理 throw 與 throws.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
第一單元 建立java 程式.
Java程序设计教程 第一讲 Java概述.
Java的程式架構與基本觀念 Java語言的歷史 Java程式的開發環境 Java程式的架構 輸出與輸入物件之使用 工具使用方法介紹
四資二甲 第三週作業 物件導向程式設計.
程設一.
第二章 JAVA语言基础.
第三章 控制结构.
程設一.
程式設計實作.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
Java语言程序设计 清华大学出版社 第9章 网络通信.
Ch11 JAVA的例外處理 物件導向程式設計(II).
例外處理(Exception Handling)
Java 的例外與輸入出檔案處理 Jing Ming Huang.
Java基础 JavaSE异常.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
Java程式概觀.
流程控制 大綱 傳遞參數給main()方法 流程控制的用途與種類 if判斷敘述 switch 判斷敘述.
程式設計實作.
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
第2章回顾 标识符:不用记,动手 关键字:if, else, switch, for, while, do, break, continue, void, …… 局部变量和成员变量 ①变量作用域 ②内存布局 基本数据类型 ①4类8种 ②互相转换 流程控制语句 ①分支 if……else, switch.
第 14 章 例外處理.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
Java语言程序设计 第五部分 Java异常处理.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
檔案讀寫與例外處理 (File IO and Exception Handling)
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
Java 程式設計 講師:FrankLin.
service-side: throw Exceptions client-side: try-and-catch
异常及处理.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Java程序设计 第2章 基本数据类型及操作.
C/C++/Java 哪些值不是头等程序对象
第一單元 建立java 程式.
第二章 Java基本语法 讲师:复凡.
第7章 异常处理.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
龍老師我不會Debug QQ.
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
迴圈(重複性結構) for while do while.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
判斷(選擇性敘述) if if else else if 條件運算子.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第五章 例外處理(Exception Handling)與Package
方法(Method) 函數.
InputStreamReader Console Scanner
Presentation transcript:

例外處理 例外的基本觀念 多重例外處理 throw 與 throws

何謂 Bug ? “Bug”中文的解釋即是臭蟲、小蟲的意思 程式上的錯誤依性質可分為以下 3 種: 程式語法上的錯誤: char c = “SCJP”; File f = new File(“xxx”); // 忘了 import java.io.*; 執行時期的錯誤: 陣列元素索引值超出最大範圍。 整數除以 0。 邏輯的錯誤: 利息的計算公式、公司獎金配發比例以及是否要進位(四捨五入) …等。

例外的基本觀念 例外的基本觀念 在執行程式時,經常發生一些不尋常的狀況。例如: 要開啟的檔案不存在。 陣列的索引值超過了陣列容許的範圍。 使用者輸入錯誤。 Java把這類不尋常的狀況稱為「例外」(exception)。 為何需要例外處理? 易於使用 可自行定義例外類別 允許我們拋出例外 不會拖慢執行速度

public static void main(String args[]) int arr[]=new int[5]; // 容許5個元素 程式範例 // app13_1, 索引值超出範圍 public class app13_1 { public static void main(String args[]) int arr[]=new int[5]; // 容許5個元素 arr[10]=7; // 索引值超出容許範圍 System.out.println("end of main() method !!"); } Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at app13_1.main(app13_1.java:7)

定義例外的處理 定義例外的處理的語法如下: try { // 要檢查的程式敘述; } catch(例外類別 變數名稱) // 例外發生時的處理敘述; finally // 一定會執行的程式碼; try 區塊 catch 區塊 fnally 區塊 程式一定會執行的區塊,可不寫

定義例外的處理: try 撰寫程式的時候,可將容易發生Exception的程式碼先利用 try 區塊包住。 catch 如果有發生Exception時,利用 catch 區塊攔截錯誤訊息並執行此區塊內的程式碼。 finally 用在程式”跳離” try-catch 區塊之前必須執行的程式區段,不論程式是否有例外(Exception)發生。finally 區段是 always execute 的程式區段。 try – catch  Error handling

常見的 Exception: 執行期例外 說明 ArithmeticException 數學運算時的例外。例如:某數除以0。 ArrayIndexOutOfBoundsException 陣列索引值超出範圍。 NegativeArraySizeException 陣列的大小為負數。 NullPointerException 物件參照為null,並使用物件成員時所產生的例外。 IOException 當輸入異常時所產生的例外。 ParseException 分析時發生的錯誤所產生的利外。 Exception 通用性例外類別,若不清楚可能會發生的例外,可以用此來代表。 NumberFormatException 數值格式不符所產生的例外。

this line is always executed!! end of main() method!! // app13_2,例外的處理 02 public class app13_2 03 { 04 public static void main(String args[]) 05 { 06 try // 檢查這個程式區塊的程式碼 07 { 08 int arr[]=new int[5]; 09 arr[10]=7; 10 } 11 catch(ArrayIndexOutOfBoundsException e) 12 { 13 System.out.println("index out of bound!!"); 14 } 15 finally // 這個區塊的程式碼一定會執行 16 { 17 System.out.println("this line is always executed!!"); 18 } 19 System.out.println("end of main() method!!"); 20 } 21 } 如果捕捉到例外,Java會利用例外類別建立一個類別變數 e: 如果拋例外,便執行此區塊的程式碼 app13_2 OUTPUT index out of bound!! this line is always executed!! end of main() method!!

ArrayIndexOutOfBoundsException // app13_3,例外訊息的處理 02 public class app13_3 03 { 04 public static void main(String args[]) 05 { 06 try 07 { 08 int arr[]=new int[5]; 09 arr[10]=7; 10 } 11 catch(ArrayIndexOutOfBoundsException e) 12 { 13 System.out.println("index out of bound!!"); 14 System.out.println("Exception="+e); // 顯示例外訊息 15 } System.out.println("end of main() method !!"); 17 } 18 } 丟出例外 ArrayIndexOutOfBoundsException 被對應的catch捕捉 app13_3 OUTPUT index out of bound!! Exception=java.lang.ArrayIndexOutOfBoundsException end of main() method !!

例外處理入門 不適當的例外處理方式 較為正確的處理方式 例外處理最好只用於錯誤處理,而不應是用於程式業務邏輯的一部份,因為例外的產生要消耗資源。 while(true) { try System.out.println(args[i]); i++; } catch(ArrayIndexOutOfBoundsException e) // .... for(int i = 0; i < args.length; i++) { System.out.println(args[i]); } 不適當的例外處理方式 較為正確的處理方式

上機練習 試寫一個程式,讓使用者輸入(1~2)數字,代表甲班和乙班來選擇班級,並列印您的班級、作號、姓名,若輸入的不是數字則處理此例外,輸出”請小心輸入!!”。

多重例外處理 多重例外處理語法架構: try { …// Statement } catch(Exception1 e1) catch(Exception2 e2)

NullPointerException IndexOutOfBoundsException FileNotFoundException 例外類別的繼承架構 : 例外類別可分為兩大類:java.lang.Exception與java.lang.Error。 StackOverflowError OutOfMemoryError VirtualMachineError AWTError AssertionError Error Exception j2sdk 1.4 Throwable ArithmeticException NullPointerException IndexOutOfBoundsException RuntimeException IOException EOFException FileNotFoundException

多重例外處理的順序:有繼承關係時,先子後父 try { …// Statement } catch(FileNotFoundException e1) catch(Exception e2) Exception下的子類別 父類別

NullPointerException IndexOutOfBoundsException FileNotFoundException StackOverflowError OutOfMemoryError VirtualMachineError AWTError AssertionError Error Exception j2sdk 1.4 Throwable ArithmeticException NullPointerException IndexOutOfBoundsException RuntimeException IOException 父類別 EOFException FileNotFoundException 子類別

將例外事件一層層的往上丟直到被處理為止,這整個過程就稱為 Call Stack Mechanism。 JVM 接到 main() { A() { B() { JVM會自行處理 所接到的例外事件! C() { Error 發生! 系統丟出了一個 Exception 事件

Call Stack 與 try-catch main() { A() { B() { try { C() { …//丟出一個Exception } catch (Exception) { …// 錯誤處理程式!

接著上一個上機練習,處理陣列索引超出範圍例外,列印例外訊息“陣列索引超出範圍”。接著再處理數字格式例外,列印例外訊息” 請輸入數字”。

throw 與 throws 拋出例外有下列兩種方式: 於程式中拋出例外(throw)。 指定method拋出例外(throws) 。

throw 與 throws 於程式中拋出例外(throw): throw 關鍵字是用來呼叫或傳遞一個例外,所以我們可以利用它在程式中觸發一個例外錯誤。 throw所丟出的例外物件同樣可以使用try-catch敘述處理。 throw 的程式語法: 丟出一個例外物件變數 throw 例外物件變數; 丟出一個匿名的例外物件 throw new Exception(錯誤訊息字串);

程式範例 { public static void main(String args[]) int a=4,b=0; try public class app13_4 { public static void main(String args[]) int a=4,b=0; try if(b==0) throw new ArithmeticException(); // 拋出例外 else System.out.println(a+"/"+b+"="+a/b); // 若沒有拋出例外,則執行此行 } catch(ArithmeticException e) System.out.println(e+" throwed"); /* app13_4 OUTPUT*/ java.lang.ArithmeticException throwed

程式範例 public class throwSample { public static void main(String[] args) try throw new Exception("測試錯誤訊息!"); } catch(Exception e) System.out.println("例外發生:" + e.toString());

throws : 撰寫Java程式時,若方法(method)中會產生一個例外錯誤,則可在宣告方法時加上 throws 關鍵字,來修飾該方法。 throws 的程式語法: 方法名稱(參數列) throws ext1,ext2 … { ….. } throws 一定要擺在”方法參數列後面”以及“{“(方法實作開始符號)前。

程式範例 public class throwsSample { public static String aMethod() throws Exception return "測試錯誤訊息!"; } public static void main(String[] args) try System.out.println(aMethod()); catch(Exception e) {}

public static void aaa(int a,int b) throws ArithmeticException int c; public class app13_6 { public static void aaa(int a,int b) throws ArithmeticException int c; c=a/b; System.out.println(a+"/"+b+"="+c); } public static void main(String args[]) try aaa(4,0); catch(ArithmeticException e) System.out.println(e+" throwed"); /* app13_6 OUTPUT */ java.lang.ArithmeticException: / by zero throwed

試在主類別中宣告一個類別方法Sum(int n) 。 上機練習 試在主類別中宣告一個類別方法Sum(int n) 。 判斷傳入的參數 n 是否小於零,如果是,則拋出一個IllegalArgumentException(“n應為正整數”) 例外。 累加1~n得數字和,並將其值返回。 在主方法中完成下列要求: 使用者可以輸入一個整數,若所輸入的不是整數,則拋出一個NumberFormatException例外,同時列印”請輸入整數”。 若使用者輸入的整數 < 0,則拋出IllegalArgumentException列外。 將數字 1~n 的總和列印在銀幕上。

Home Work 請設計一個成績輸入程式,若成績超過100分,則拋出例外顯示”除了天才外,不可能超過100分”;若低於 0 分,則拋出例外顯示”您要向學生借分數嗎?”。