例外處理(Exception Handling)

Slides:



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

Java 程序设计(第二版) 普通高等教育 “ 十一五 ” 国家级规划教材 辛运帷等 编著 徐小平 主讲.
第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
Java程序设计教程 第一讲 Java概述.
Java的程式架構與基本觀念 Java語言的歷史 Java程式的開發環境 Java程式的架構 輸出與輸入物件之使用 工具使用方法介紹
四資二甲 第三週作業 物件導向程式設計.
數位芝麻網路公司( 軟體工程師
面向对象的程序设计(一).
程設一.
第二章 JAVA语言基础.
第二部分 Java语言基础篇 第4章 Java语言与面向对象 (之一).
第5章 Java中类、对象、接口 及包的概念 5.1 类的基本概念 5.2 类的继承概念 5.3 抽象类和接口 5.4 包.
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
程設一.
程式設計實作.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
Java语言程序设计 清华大学出版社 第9章 网络通信.
物件導向程式設計 (Object-Oriented rogramming)
Java基础 JavaSE异常.
Classes Lecturer: 曾學文.
實作輔導 日期: 3/11 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
第 14 章 例外處理.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
职责链模式.
Java语言程序设计 第五部分 Java异常处理.
第六章 编写客户端程序.
Java程序设计 第9章 继承和多态.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
例外處理與 物件序列化(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 一个编程实例
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
异常及处理.
Java程序设计 第2章 基本数据类型及操作.
C/C++/Java 哪些值不是头等程序对象
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
Multithread 多執行緒 以GUI為例了解物件以及Event
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
第二章Java基本程序设计.
第7章 异常处理.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
辅导课程十二.
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
第4讲 类和对象、异常处理 ggao.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
Summary
Presentation transcript:

例外處理(Exception Handling) 在Java中,程式錯誤的處理是由所謂的「例外處理機制」 (Exception-handling mechanism)來負責。

本章重點 什麼是「例外」 「例外」的種類 如何指定「例外」的處理方式 列印「例外」物件的說明 使用throws敘述 Throwable類別階層 自定「例外」 類別 Java Runtime如何決定「例外」處理常式 Java語言實務 例外處理

什麼是「例外」 影響程式中「指令敘述」正常執行順序的「異常狀態」;例如: 進行除法運算時,分母值為零 存取陣列元素時所用的索引值超出陣列的大小 程式中欲開啟以便讀取資料的檔案尚未存在 記憶體不足 硬碟無法正常運作 Java語言實務 例外處理

異常狀態發生時, Java Runtime會中止目前指令的執行、 產生此異常狀態的「例外」物件 (Exception Object) 並 決定如何進一步處理此異常狀態 Java語言實務 例外處理

「例外」的種類 Checked Exception Runtime Exception Exception UnChecked Exception Runtime Exception Error Java語言實務 例外處理

Runtime Exception及Error由Java系統自行處理。 Checked Exception的處理強制由程式設計師於程式中指定 UrlTest.java:10: Exception java.net.MalformedURLException must be caught , or it must be declared in the throws clause of this method. URL url = new URL(args[0]); Java語言實務 例外處理

如何指定「例外」的處理方式 由下述的程式結構決定: try { // 會產生例外的程式碼 java statements; } //可以有一個以的catch區塊 catch (ExceptionType1 exObject1) { // 處理例外型態一的程式碼 java statements-exception handling; } catch (ExceptionType2 exObject2) { // 處理例外型態二的程式碼 java statements-exception handling; } // … finally {// 例外處理結束前執行的程式碼 //本區塊可省略 java statements; } Java語言實務 例外處理

程式Ex7_1除數為零-程式範例 import java.io.*; class Exception1 { public static void main (String args[]) { int x, y; try { y = 0; x = 44 / y; //本敘述會產生除數為零的Runtime Exception System.out.println(“Actually this line will not be printed”); } catch (ArithmeticException e) { // catch並處理除數為零的錯誤      System.out.println(“Error-->Divided by zero!”); finally { //執行Finally區塊的指令 System.out.println(“The statement in the Finally Block will always be executed!”);   } // end of main } // end of class Java語言實務 例外處理

try區塊的指令會產生一個除數為零的「例外」 程式輸出 Error-->Divide by zero! The statement in the Finally Block will always be executed! Java語言實務 例外處理

列印「例外」物件的說明 「例外」物件 的getMessage() 方法會傳回有關該「例外」物件的文字說明: 可能結果: catch (ArithmeticException e) { // catch並處理除數為零的錯誤   System.out.println(“Exception: ” + e.getMessage()); } 可能結果: Exception: / by zero The statement in the Finally Block will always be executed! Java語言實務 例外處理

使用throws敘述 throws關鍵字可以用來指定由外層的方法來來處理例外 使用throws關鍵字的一般規定: type method-name (parameter-list) throws exception-list { // body of method java statements; } Java語言實務 例外處理

程式Ex7_2使用throws-程式範例 import java.net.*; public class UrlTest {public static void main(String [] args) throws MalformedURLException {if (args.length ==1) {URL url = new URL(args[0]); System.out.println ("URL: " + url.toExternalForm() + "\n" + " File: " + url.getFile() + "\n" + " Host: " + url.getHost() + "\n" + " Port: " + url.getPort() + "\n" + " Protocol: " + url.getProtocol() + "\n" + " Reference: " + url.getRef()); } else System.out.println("Usage: UrlTest <URL>"); } } Java語言實務 例外處理

java UrlTest http://www.npic.edu.tw:8080 輸出結果: 執行方式: java UrlTest http://www.npic.edu.tw:8080 輸出結果: URL: http://www.npic.edu.tw File: / Host:    www.npic.edu.tw Port:    8080 Protocol:  http Reference: null 執行方式: java UrlTest amazon.com 輸出結果: Exception in thread "main" java.net.MalformedURLException: no protocol: amazon.com at java.net.URL.<init>(Unknown Source) at UrlTest.main(UrlTest.java:9) Java語言實務 例外處理

自行控制「例外」的產生 使用throw敘述觸發「例外」 狀態 一般語法: throw ThrowableInstance; ThrowableInstance物件必需是Throwable類別或其子類別的成員 Java語言實務 例外處理

程式Ex7_3 使用throw敘述 輸出結果: 程式Ex7_3 使用throw敘述 import java.io.*; class ThrowDemo { static void main(String args[]) { try { throw new IllegalAccessException(“demo Throw IllegalAccess Exception”); } catch (IllegalAccessException e) { System.out.println(“Exception caught: “ + e.getMessage()); 輸出結果: Exception caught: demo Throw IllegalAcess Exception Java語言實務 例外處理

Throwable類別階層 Object Throwable Error Exception RuntimeException ... Parent-child relation Java語言實務 例外處理

自定「例外」 類別 撰寫自定的「例外」: 首先必須自行定義一個屬於Throwable類別之後代的子類別 然後利用new指令建立一個自定之「例外」類別的物件 最後利用throw敘述觸發「例外」 Java語言實務 例外處理

程式Ex7_4 自定「例外」類別 (1/4) import java.io.*; // 自定例外類別 class InvalidTransferException extends Exception { InvalidTransferException(String emsg) super(emsg); // invoke the constructor of the parent class } } // end of class Java語言實務 例外處理

程式Ex7_4 自定「例外」類別 (2/4) // 轉帳處理類別 class ExceptionDemo { static int balance; // 存放餘額的變數 ExceptionDemo(int b) // 建構子 balance = b; }   void transfer(int amount)throws InvalidTransferException if (amount > balance) // 當轉帳金額大於餘額時就產生例外 throw new InvalidTransferException("Transfer Amount greater than balance!"); else balance = balance - amount; // 否則將餘額更新成扣除轉帳金額後之值 } // end of method transfer } // end of class ExceptionDemo Java語言實務 例外處理

程式Ex7_4 自定「例外」類別 (3/4) // 測試自定例外類別的使用 public class MyExceptionDemo { public static void main (String args[]) {// 產生一個處理轉帳的類別並將餘額初值設為1500 ExceptionDemo edemo = new ExceptionDemo(1500);  System.out.println("Balance before transfer:" + edemo.balance); try {edemo.transfer(2000); // 進行轉帳2000元的交易 System.out.println("Current Balance:" + ExceptionDemo.balance); } catch (InvalidTransferException e) {System.out.println("Exception caught: " + e.getMessage()); } // end of method main } // end of class MyExceptionDemo Java語言實務 例外處理

程式Ex7_4 自定「例外」類別 (4/4) 執行結果: Balance before transfer:1500 Exception caught: Transfer Amount greater than balance! Java語言實務 例外處理

Java Runtime如何決定「例外」處理常式 基本原則 「由內而外」 「由上而下」 「順序優先」 Java語言實務 例外處理

「由內而外」 當有巢狀式的try區塊時,Java Runtime會先從與最內層的try區塊所對應的catch區塊去尋找適當的「例外」處理常式,若沒有才去尋找外層的catch區塊, try { // 程式區塊一 try // 程式區塊二 { try // 程式區塊三 java statements; } catch(…) { //exception handler 3} catch(…) { //exception handler 2} catch(…) { //exception handler 1} Java語言實務 例外處理

「由上而下」 當方法a呼叫方法b而方法b又呼叫方法c時,若於方法c的執行過程中產生了「例外」,則Java Runtime會依「呼叫堆疊」(Call Stack) 中各方法出現的順序依序從上而下尋找處理常式 method_a // 在method_a的try區塊內呼叫 method_b { try { … } catch (Exception e) {//method_c, method_b及method_a所產生的例外都會在此區塊處理 …} }  method_b throws Exception // method_b 呼叫method_c {… }  method_c throws Exception //method_c可能會產生例外 {… } Call stack c b a Java語言實務 例外處理

「順序優先」 當一個try區塊對應有一個以上的catch區塊時,Java Runtime會按照各catch區塊在程式中出現的順序尋找合適的處理常式,找到之後就執行該處理常式的指令,其它的catch區塊則跳過不執行 。 try {// java statements … } catch(Exception e) {// Exception handling routine catch(ArithmeticExceeption ae) {// Arithmetic Exception handling routine catch(ArrayIndexOutOfBoundsException aiob) { … } 請注意: 右例簡碼中 catch區塊出現的順序 並不好,編譯時 編譯器會視為有誤。 Java語言實務 例外處理