Ch11 JAVA的例外處理 物件導向程式設計(II).

Slides:



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

多元評量與 Greenfoot 簡介 南港高中高慧君. 演講大綱 多元評量 高中階段程式設計教學目標與困境 Greenfoot 快速入門 – 袋熊吃樹葉 – 沙灘螃蟹 Greenfoot 臺灣社群介紹 2.
第四章 类、对象和接口.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
第一單元 建立java 程式.
项目6 通用堆栈.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
程設一.
第二章 JAVA语言基础.
例外處理 例外的基本觀念 多重例外處理 throw 與 throws.
Ch07 介面與多重繼承 物件導向程式設計(II).
第三章 控制结构.
程式設計實作.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
Visual C++ introduction
例外處理(Exception Handling)
Java 的例外與輸入出檔案處理 Jing Ming Huang.
JAVA 程式設計與資料結構 第七章 繼承與Interface.
Java基础 JavaSE异常.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
C語言簡介 日期 : 2018/12/2.
第 14 章 例外處理.
類別(class) 類別class與物件object.
Java语言程序设计 第五部分 Java异常处理.
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
Java 程式設計 講師:FrankLin.
service-side: throw Exceptions client-side: try-and-catch
异常及处理.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Java程序设计 第2章 基本数据类型及操作.
C/C++/Java 哪些值不是头等程序对象
第一單元 建立java 程式.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
辅导课程八.
第 19 章 XML記憶體執行模式.
第7章 异常处理.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
龍老師我不會Debug QQ.
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
物件導向程式設計 參考書目: 1. 洪維恩,C++ 教學手冊 第三版,旗標出版圖書公司。 2. 陳錦揮,Java 初學指引,博碩文化 3
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
第4讲 类和对象、异常处理 ggao.
迴圈(重複性結構) for while do while.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第五章 例外處理(Exception Handling)與Package
陳維魁 博士 儒林圖書公司 第八章 例外處理 陳維魁 博士 儒林圖書公司.
方法(Method) 函數.
InputStreamReader Console Scanner
Presentation transcript:

Ch11 JAVA的例外處理 物件導向程式設計(II)

大綱 Java的例外處理 例外處理的程式敘述 丟出例外 自訂Exception類別 2018/11/13

Java的例外處理 Java語言的「例外」(Exception)是指產生了例外物件,這是一種例外事件,在程式執行時,發生不正常執行狀態時所產生事件的物件,「例外處理」(Handling Exceptions)就是在處理這些例外事件。 例外處理的目的是為了讓程式能夠更「強壯」(Robust),當程式遇到不尋常情況,也不會造成程式「崩潰」(Crashing),進而導致整個系統當機。 2018/11/13

例外處理的架構-說明 Java的例外處理架構是一種您丟我撿的架構,當JVM執行Java程式有錯誤發生時,就會產生例外物件,有了例外,JVM開始尋找是否有方法可以處理。 一種是在方法上加上例外處理的程式敘述來處理例外(在第13-2節說明)。 或是將例外丟給其它方法來處理(在第13-3節說明)。 2018/11/13

例外處理的架構-圖例 2018/11/13

例外處理的架構-過程 在執行Java程式時,從main()方法呼叫methodA()方法,接著呼叫methodB()方法,最後呼叫methodC()方法,呼叫過程是存入稱為「呼叫堆疊」(Call Stack),這是一種先進後出的資料結構,用來儲存呼叫方法的狀態資料,以便返回還原成呼叫時的狀態。 當methodC()方法發生錯誤產生例外物件A,JVM倒過來找尋方法是否擁有例外處理,首先是methodC()和methodB(),因為沒有例外處理,所以例外會傳遞給methodA(),在此方法擁有例外處理A,所以可以處理例外物件A。 2018/11/13

Throwable類別-說明 在Java產生的例外物件屬於Throwable類別或其子類別的實例,Throwable類別擁有2個直接繼承的子類別,如下所示: Error類別:其子類別屬於JVM的嚴重錯誤,這種錯誤會導致程式終止執行,所以並沒有辦法使用例外處理來處理這種錯誤。 Exception類別:其子類別是各種例外物件,也是例外處理可以處理的部分,事實上,部分例外物件也是一種錯誤,只是錯誤沒有嚴重到需要終止程式執行,例外處理就是在防止程式終止執行,並且作一些補救操作。 2018/11/13

Throwable類別-說明 Exception類別擁有子類別RuntimeException,在此類別的子類別是一些常見的例外,如下表所示: 2018/11/13

例外處理的程式敘述-區塊架構 Java語言例外處理程式敘述分為try、catch、finally三個程式區塊,可以處理特定的例外物件,如下所示: try { ……… } catch(ExceptionType e) { // 例外處理 ……… } finally { ……… } 2018/11/13

例外處理的程式敘述-try程式區塊 try程式區塊 在try區塊的程式碼檢查是否產生例外,當例外產生時,就會丟出指定例外類型的物件。 2018/11/13

例外處理的程式敘述-catch程式區塊 catch程式區塊 在try程式區塊的程式碼如果丟出例外,Java程式需要準備一到多個catch程式區塊處理不同類型的例外,傳入參數e是例外類型的物件(繼承自Throwable類別),可以取得例外的相關資訊,其相關方法如下表所示: 2018/11/13

範例1:例外處理_除以零 b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { String s1 = t1.getText(); int i1 = Integer.parseInt(s1); int i2 = Integer.parseInt(t2.getText()); int ans = i1 / i2; t3.setText(Integer.toString(ans)); } } ); Ch12_01.java 2018/11/13

範例1(續) b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { try String s1 = t1.getText(); int i1 = Integer.parseInt(s1); int i2 = Integer.parseInt(t2.getText()); int ans = i1/i2; t3.setText(Integer.toString(ans)); } catch(ArithmeticException e) t3.setText(e.getMessage()); } ); Ch12_02.java 2018/11/13

例外處理的程式敘述-finally程式區塊 2018/11/13

同時處理多種例外 在Java程式的try/catch/finally程式敘述,可以使用多個catch程式區塊來同時處理多種例外物件,如下所示: try{ } catch( ArithmeticException e ) { ……… } catch( ArrayIndexOutOfBoundsException e ) finally { } 2018/11/13

使用throw程式敘述-說明 Java程式碼可以使用throw指令丟出例外,其語法如下所示: throw ThrowableObject; 上述ThrowableObject是繼承自Throwable類別的物件,表示丟出例外物件。 2018/11/13

使用throw程式敘述-範例 例如:在Java程式丟出ArithmeticException例外物件,如下所示: throw new ArithmeticException("值為0"); 上述程式碼使用new運算子建立例外物件,建構子參數是讓getMessage()方法取得的例外說明字串。 2018/11/13

範例2:方法本身丟出例外 public class Ch12_04 { // 主程式 { // 主程式 public static void main(String[] args) { // 例外處理程式敘述 try // 取得參數字串 { int value = Integer.parseInt(args[0]); if ( value == 0 ) // 丟出ArithmeticException例外 throw new ArithmeticException("值為0"); } catch( ArithmeticException e ) { // 處理ArithmeticException例外 System.out.println("例外說明: "+e.getMessage()); System.out.print("例外原因: "); e.printStackTrace(); finally { System.out.println("錯誤處理結束"); } 2018/11/13

在方法丟出例外 在某些情況,雖然方法會產生例外,但是我們並不希望在此方法建立例外處理(通常是為了集中處理例外事件),此時,可以將例外丟出,讓呼叫此方法的其它方法接手處理例外,如下所示: static double cal(double a,double b,double c) throws IllegalArgumentException { ……… throw new IllegalArgumentException( "c不能是0!"); ……… } 2018/11/13

範例3:在方法丟出例外,由別的呼叫者處理 2018/11/13 public class Ch12_05 { // 類別方法: 計算a*b/c的值 static double cal(double a, double b, double c) throws IllegalArgumentException { double value; if ( c == 0 ) { // 丟出IllegalArgumentException例外 throw new IllegalArgumentException("c不能是0!"); } else { value = a*b/c; if ( value < 0 ) throw new IllegalArgumentException("運算結果小於0"); } return value; // 主程式 public static void main(String[] args) { double result; try // 取得參數值 { double a = Double.parseDouble(args[0]); double b = Double.parseDouble(args[1]); double c = Double.parseDouble(args[2]); result = cal(a, b, c); // 呼叫方法 System.out.println("計算結果: " + result); } catch( IllegalArgumentException e ) { // 處理IllegalArgumentException例外 System.out.println("例外說明: "+e.getMessage()); System.out.print("例外原因: "); e.printStackTrace(); catch( ArrayIndexOutOfBoundsException e ) { System.out.println(e.getMessage()); 2018/11/13

自訂Exception類別 在Java程式除了使用現成Exception類別的例外,也可以自訂Exception類別建立應用程式所需的例外類別,如下所示: class UserException extends Exception { int data; public UserException(int data) { this.data = data; } public String getMessage() { return ("錯誤! 出價太多次: " + data); } } 2018/11/13

範例4:自訂Exception類別 2018/11/13 // 自訂Exception類別, 繼承Exception類別 class UserException extends Exception { // 變數宣告 int data; // 建構子 public UserException(int data) { this.data = data; } // 覆寫getMessaeg()方法 public String getMessage() { return ("錯誤! 出價太多次: " + data); } } // 主程式類別 public class Ch12_06 { // 主程式 public static void main(String[] args) { try { int i; for ( i = 0; i < 5; i++ ) { if (i == 3) // 丟出自訂的例外 throw new UserException(3); System.out.println("出價次數: " + i); } catch( UserException e) { // 處理自訂的例外 System.out.println("例外說明: "+e.getMessage()); System.out.print("例外原因: "); e.printStackTrace(); return; finally { System.out.println("錯誤處理結束!"); } System.out.println("程式結束!"); 2018/11/13