Java基础 JavaSE异常.

Slides:



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

第3-2章 类与 对象 Java类的特性 教学内容: 类的私有成员与公共成员 方法的重载 构造方法 实例成员与静态成员 重点: 重载 难点:
第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
项目6 通用堆栈.
Java程序设计教程 第一讲 Java概述.
四資二甲 第三週作業 物件導向程式設計.
面向对象的程序设计(一).
面向对象程序设计(Java) 徐志红
MVC Servlet与MVC设计模式.
第一章 面向对象程序设计.
程設一.
第二章 JAVA语言基础.
第二部分 Java语言基础篇 第4章 Java语言与面向对象 (之一).
Ch07 介面與多重繼承 物件導向程式設計(II).
第三章 控制结构.
程設一.
Ch08 巢狀類別 物件導向程式設計(II).
程式設計實作.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
例外處理(Exception Handling)
常用工具类.
Java语言程序设计 第七部分 多线程.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
2018/11/23 面向对象与多线程综合实验-数据库操作 教师:段鹏飞.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
程式設計實作.
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
第 14 章 例外處理.
Java语言程序设计 第五部分 Java异常处理.
第6章 异常的捕获及处理 6.1 异常简介 6.2 异常类的继承结构 6.3 异常处理机制 6.4 异常处理 6.5 本章小结.
Java程序设计 第9章 继承和多态.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
類別的繼承 Vehicle Car.
SPOTO TM JAVA课程 JAVA中的OO语法
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
檔案讀寫與例外處理 (File IO and Exception Handling)
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
异常及处理.
Java程序设计 第2章 基本数据类型及操作.
C/C++/Java 哪些值不是头等程序对象
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
JAVA 编 程 技 术 主编 贾振华 2010年1月.
第二章 Java基本语法 讲师:复凡.
第7章 异常处理.
第二章 Java基本语法 讲师:复凡.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
龍老師我不會Debug QQ.
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
辅导课程十二.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
第4讲 类和对象、异常处理 ggao.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

Java基础 JavaSE异常

课程目标 理解异常的概念 运用try块、catch块和finally块处理异常 Java中异常类的继承体系结构 运用多重catch块处理异常 Course Contents 理解异常的概念 运用try块、catch块和finally块处理异常 Java中异常类的继承体系结构 运用多重catch块处理异常 运用嵌套try/catch块处理异常 运用关键字throw和throws处理异常 用户自定义异常

什么是异常? 程序中出现的错误被称为异常; 异常可分为两大类:编译时异常和运行时异常; 编译时异常一般是指语法错误,可以通过编译器的提示加以修正,这里我们不予讨论; 运行时异常包括: 运行错误:如数组下标越界,除数为0等; 逻辑错误:如年龄超过200岁等。

产生异常的原因 产生异常的原因多种多样,大致有: 系统资源不可用:如内存分配失败,文件打开失败,数据源连接失败等等; 程序控制不当:如被零除,负数开方,数组下标越界等等。

产生异常的原因 当异常发生时,程序一般会作出如下反应: 发生异常的部分产生系统定义的错误信息; 程序意外终止,并将控制权返回操作系统; 程序中所有已分配资源的状态保持不变,这样将会导致资源泄漏。 那么我们就必须对有可能产生的异常进行处理。

产生异常的原因 public class ExceptionDemo { public static void main(String[] args) { int a = 10, b = 0, c; //这里的除数为0,将会产生异常 c = a / b; System.out.println(c); }

try块和catch块 try块:一般用来监视有可能产生异常的代码部分; catch块:当异常产生后,catch块捕捉异常,并在其中对异常进行处理。

try块和catch块一般形式 try { …… //监视有可能发生异常的代码段 } catch (异常类型) //捕获发生的异常 …… //监视有可能发生异常的代码段 } catch (异常类型) //捕获发生的异常 …… //对异常进行处理

Java中的异常类 异 常 说 明 Exception 异常层次结构的根类 RuntimeException 异 常 说 明 Exception 异常层次结构的根类 RuntimeException 许多java.lang异常的基类 ArithmeticException 算术异常,如:除数为0 IllegalArgumentException 方法接收到非法参数 ArrayIndexOutOfBoundsException 数组下标越界 NullPointerException 访问空引用 ClassNotFoundException 不能加载所需的类 NumberFormatException 字符串转换数字失败 IOException I/O异常的根类 FileNotFoundException 找不到文件 EOFException 文件结束

try块和catch块 public class ExceptionDemo { public static void main(String[] args) int a = 10, b = 0, c; try //监视有可能出现异常的代码段 c = a / b; System.out.println(c); } catch (ArithmeticException ae) //如果出现异常,将被捕获 System.out.println("除数为0。"); System.out.println("程序结束。");

finally块 无论try/catch块中发生了什么,finally块都一定会执行;

try/catch/finally块示例 public class ExceptionDemo { public static void main(String[] args) { int a = 10, b = 0, c; try { c = a / b; System.out.println(c); } catch (ArithmeticException ae) { System.out.println("除数为0。"); //不论是否发生异常,finally块中的语句都会执行 finally { System.out.println("finally块中的语句。"); System.out.println("程序结束。");

try/catch/finally块示例 无异常 发生异常

try/catch/finally应用模型 { …… //连接到数据库的代码,有可能发生异常 …… //对数据库进行操作的代码,有可能发生异常 } catch (SQLException sqle) //捕获数据库异常 …… //对捕获的异常进行处理 finally …… //在finally块中执行关闭数据库的操作

异常类体系结构图 Exception ArithmeticException NullPointerException Object Throwable Error SQLException RuntimeException NumberFormatException …… AWTError ThreadDeath ClassNotFoundException

异常类体系结构说明 Throwable有两个直接子类,它们是: Error类:Error类的异常通常为内部错误,因此在正常情况下并不期望用户程序捕获它们; Exception类:绝大部分用户程序应当捕获的异常类的根类;一些常用的异常类都直接或间接派生自Exception类,因此我们可以认为绝大部分的异常都属于Exception。

异常类中的常用方法 方法原型 说 明 在Exception类中定义的方法,被继承到所有的异常类中,用于获得与异常相关的描述信息。 说 明 String getMessage() 在Exception类中定义的方法,被继承到所有的异常类中,用于获得与异常相关的描述信息。 void printStackTrace() 在Exception类中定义的方法,用于在控制台上显示有关异常的信息,不但有异常的原因,还涉及产生异常的代码行。

多重catch块 有时候,在try块中的代码段将有可能产生多种不同类型的异常,而我们又需要针对不同的异常类型进行不同的处理方式,那么我们就可以使用多重catch块,来分别捕获不同类型的异常。

多重catch块示例 public class ExceptionDemo { public static void main(String[] args) { int a, b, c; try { //从命令行参数获得用户输入的数字 a = Integer.parseInt(args[0]); b = Integer.parseInt(args[1]); c = a / b; System.out.println(c); } catch (ArrayIndexOutOfBoundsException aioobe) { //捕捉数组下标越界异常 System.out.println("您没有指定命令行参数。"); catch (NumberFormatException nfe) { //捕捉字符串到数字转换异常 System.out.println("您输入的不是数字。"); catch (ArithmeticException ae) { //捕捉算术(除数为0)异常 System.out.println("除数为0。"); catch (Exception e) { //捕捉其它不可预测的异常 System.out.println(e.getMessage()); System.out.println("程序结束。");

多重catch块示例 虽然多重catch块可以同时监视多个不同类型的异常,但是try块中一旦有某个异常产生,程序就会跳转到与之异常类型最匹配的catch块中执行,然后执行finally块(如果有finally块的话)或之后的语句; 也就是说,多重catch块只会捕捉到最先产生的异常,而不是把所有的异常全部捕捉完; 即:不论有多少个catch块,最多只会执行其中的一个; 请注意catch块的书写顺序:类层次越低的越往上写,越高的越往下写。

多重catch块书写顺序示例 public class ExceptionDemo { public static void main(String[] args) { int a, b, c; try { a = Integer.parseInt(args[0]); b = Integer.parseInt(args[1]); c = a / b; System.out.println(c); } //由于Exception类的层次最高,以下的所有异常类型都是其子类,这样写将会报错 catch (Exception e) { //捕捉其它不可预测的异常 System.out.println(e.getMessage()); catch (ArrayIndexOutOfBoundsException aioobe) { //捕捉数组下标越界异常 System.out.println("您没有指定命令行参数。"); catch (NumberFormatException nfe) { //捕捉字符串到数字转换异常 System.out.println("您输入的不是数字。"); catch (ArithmeticException ae) { //捕捉算术(除数为0)异常 System.out.println("除数为0。"); System.out.println("程序结束。");

嵌套try/catch块 有时候,整个语句块可以产生异常,而其中的某个部分又可能产生另外的异常,而我们需要分别进行处理; 嵌套try/catch块就是在一个try/catch块中包含有另外的try/catch块。

嵌套try/catch块 public class ExceptionDemo { public static void main(String[] args) /*外层try/catch块*/ try System.out.println("传递的参数是:" + args[0]); /*嵌套try/catch块*/ int num = Integer.parseInt(args[0]); System.out.println(num + "的平方是" + (num * num)); } catch (NumberFormatException nfe) System.out.println("您输入的不是数字。"); catch (ArrayIndexOutOfBoundsException aioobe) System.out.println("您没有输入命令行参数。");

throw语句 throw语句用于手工抛出异常; 执行流程将在throw语句后立即停止,转而寻找与之类型相匹配的catch块;

嵌套try/catch块 public class ThrowDemo { public static void main(String[] args) try int age = Integer.parseInt(args[0]); if (age < 0 || age > 100) //创建一个异常实例,并将其手工抛出 throw (new Exception("您输入的年龄无效。")); } System.out.println("您的年龄是:" + age + "岁。"); catch (Exception e) //捕捉异常 //打印出异常信息 System.out.println(e.getMessage());

用户自定义异常 Exception类和其子类都是系统内置的异常,这些异常不一定总能捕获程序中发生的所有异常; 有时候,我们可能要创建用户自定义的异常类; 用户自定义异常类应该是Exception类的子类; 类似于: class MyException extends Exception { …… }

用户自定义异常 class AgeException extends Exception { //用户自定义年龄异常类 public AgeException() { //构造方法 super("年龄无效。"); } public class Test { public static void main(String[] args) { try { int age = Integer.parseInt(args[0]); if (age < 0 || age > 100) { throw (new AgeException()); //抛出自定义异常类实例 System.out.println("您的年龄是:" + age + "岁。"); catch (AgeException ae) { //捕捉自定义异常类型 System.out.println(ae.getMessage()); //打印异常信息

throws关键字 如果某个函数中的代码有可能引发异常,可以使用try/catch块进行处理,这种处理方式成为“内部处理”; 一般语法: 返回值类型 函数名(参数列表) throws 异常类型 { …… }

throws关键字 public class Student //定义学生类 { private String name; //姓名 private int age; //年龄 …… //其它方法,代码略 /*为姓名赋值的方法*/ public void setName(String name) { mName = name; } /*为年龄赋值的方法,该方法有可能抛出异常*/ public void setAge(int age) throws AgeException if (age < 0 || age > 100) throw (new AgeException()); } age = age; …… //其它方法,代码略

throws关键字 当调用带有throws关键字的函数时,则必须放在 try/catch块中进行监控,否则编译器将会报错; public class ThrowsTest { public static void main(String[] args) { Student std = new Student(); try { std.setName("zhangsan"); std.setAge(24); //该方法必须放在try/catch块中 std.display(); } catch (AgeException ae) { System.out.println(ae.getMessage());

throws关键字 同样地,如果不便进行监控处理,也可以继续使用throws往外抛出异常,但不太推荐此种做法。 public class ThrowsTest { public static void main(String[] args) throws AgeException Student std = new Student(); std.setName("zhangsan"); std.setAge(180); //对该函数不进行监控,只是将异常继续往外抛 std.display(); }

Thank You !